From ba81c01b064d5a8492660dfd8f22dd37151e1cb7 Mon Sep 17 00:00:00 2001 From: jsyang Date: Tue, 12 Aug 2025 18:39:56 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A7=80=ED=95=98=EC=88=98=EC=9C=A0=EC=9E=85?= =?UTF-8?q?=EB=9F=89=20=EB=AA=A8=EB=8B=AC=20=ED=8F=89=EA=B7=A0=EC=B5=9C?= =?UTF-8?q?=EB=8C=80=EC=B5=9C=EC=86=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../underWaterInput/modal/page.tsx | 76 +++---------------- apps/fo/app/store/underWaterInput/index.tsx | 40 +++++----- 2 files changed, 34 insertions(+), 82 deletions(-) diff --git a/apps/fo/app/pages/(with-layout)/underWaterInput/modal/page.tsx b/apps/fo/app/pages/(with-layout)/underWaterInput/modal/page.tsx index 1e37569c6..355bddedd 100644 --- a/apps/fo/app/pages/(with-layout)/underWaterInput/modal/page.tsx +++ b/apps/fo/app/pages/(with-layout)/underWaterInput/modal/page.tsx @@ -4,7 +4,7 @@ import type { UnderWaterInputModalProps } from "@/app/store/underWaterInput/type import { DateMonthPicker, UITab, UiTable } from "@common/business_components/ui"; import ListDiv from "@common/business_components/ui/list_div"; import { Table, TableCell, TableHead, TableRow, TabsContent } from "@common/components/ui"; -import { useEffect, useState } from "react"; +import { use, useEffect, useState } from "react"; type ModalProps ={ fcltyName: string; @@ -34,64 +34,11 @@ export default function UnderWaterInputModal({fcltyName='', searchYear=new Date( gridListUnderWaterDetail, } = UnderWaterDetail; - // 필터링 된 후 최대, 최소, 평균 값 계산 - const setFilterAfterData = (filteredData: UnderWaterInputModalProps[]) => { - let maxRealSewageInput = Number(filteredData[0]?.realSewageInput ?? 0); - let maxSewageOccur = Number(filteredData[0]?.sewageOccur ?? 0); - let maxUnderWaterInput = Number(filteredData[0]?.underWaterInput ?? 0); - - let minRealSewageInput = Number(filteredData[0]?.realSewageInput ?? 0); - let minSewageOccur = Number(filteredData[0]?.sewageOccur ?? 0); - let minUnderWaterInput = Number(filteredData[0]?.underWaterInput ?? 0); - - let avgRealSewageInput = 0; - let avgSewageOccur = 0; - let avgUnderWaterInput = 0; - - filteredData.forEach((item: UnderWaterInputModalProps) => { - maxRealSewageInput = Math.max(Number(maxRealSewageInput), Number(item.realSewageInput)); - maxSewageOccur = Math.max(Number(maxSewageOccur), Number(item.sewageOccur)); - maxUnderWaterInput = Math.max(Number(maxUnderWaterInput), Number(item.underWaterInput)); - - minRealSewageInput = Math.min(Number(minRealSewageInput) || 0, Number(item.realSewageInput)); - minSewageOccur = Math.min(Number(minSewageOccur) || 0, Number(item.sewageOccur)); - minUnderWaterInput = Math.min(Number(minUnderWaterInput) || 0, Number(item.underWaterInput)); - - avgRealSewageInput += Number(item.realSewageInput ?? 0); - avgSewageOccur += Number(item.sewageOccur ?? 0); - avgUnderWaterInput += Number(item.underWaterInput ?? 0); - }) - - const newFilteredData = [ - { - msrDt: '평균', - realSewageInput: filteredData.length==0?0:Math.round(Number(avgRealSewageInput) / filteredData.length * 10) / 10, - sewageOccur: filteredData.length==0?0:Math.round(Number(avgSewageOccur) / filteredData.length * 1000) / 1000 , - underWaterInput: filteredData.length==0?0:Math.round(Number(avgUnderWaterInput) / filteredData.length * 1000) / 1000, - }, - { - msrDt : '최대', - realSewageInput : Math.round(maxRealSewageInput * 10) / 10, - sewageOccur : Math.round(maxSewageOccur * 1000) / 1000 , - underWaterInput : Math.round(maxUnderWaterInput * 1000) / 1000, - }, - { - msrDt : '최소', - realSewageInput : Math.round(minRealSewageInput * 10) / 10, - sewageOccur : Math.round(minSewageOccur * 1000) / 1000 , - underWaterInput : Math.round(minUnderWaterInput * 1000) / 1000, - }, - ...filteredData - ]; - return newFilteredData; - } - // 날짜 필터링 관련 상태 const [copyYearList, setCopyYearList] = useState([]); useEffect(() => { - const filteredYearData = setFilterAfterData(gridListUnderWaterDetail); - setCopyYearList(filteredYearData as UnderWaterInputModalProps[]); + setCopyYearList(gridListUnderWaterDetail); }, [gridListUnderWaterDetail]); useEffect(() => { @@ -115,9 +62,11 @@ export default function UnderWaterInputModal({fcltyName='', searchYear=new Date( setPrevEndYmDate(searchYear+'12'); } }, [searchYear, tabTerm]); + useEffect(()=>{ - unserWaterModal(fcltyName, searchYear); - }, []) + unserWaterModal(fcltyName, searchYear, searchYear+'01', searchYear+'12'); + }, [fcltyName, searchYear, unserWaterModal]); + useEffect(() => { if(endYmDate < startYmDate) { alert('종료일이 시작일보다 작습니다.') @@ -130,16 +79,13 @@ export default function UnderWaterInputModal({fcltyName='', searchYear=new Date( // 유효한 경우 현재 값을 이전 값으로 저장 setPrevStartYmDate(startYmDate); setPrevEndYmDate(endYmDate); - - const filteredData = gridListUnderWaterDetail.filter((item: UnderWaterInputModalProps) => { - // msrDt가 "2024-01" 형태이므로 "202401" 형태로 변환 - const itemDate = item.msrDt.replace('-', ''); - return itemDate >= startYmDate && itemDate <= endYmDate; - }); - const filteredYearData = setFilterAfterData(filteredData); - setCopyYearList(filteredYearData as UnderWaterInputModalProps[]); + }, [startYmDate, endYmDate, gridListUnderWaterDetail, prevStartYmDate, prevEndYmDate]); + useEffect(() => { + unserWaterModal(fcltyName, searchYear, prevStartYmDate, prevEndYmDate); + } , [fcltyName, searchYear, unserWaterModal, prevStartYmDate, prevEndYmDate]); + return ( <> {setTabTerm(val)}}> diff --git a/apps/fo/app/store/underWaterInput/index.tsx b/apps/fo/app/store/underWaterInput/index.tsx index db6fa34aa..a820a7ecf 100644 --- a/apps/fo/app/store/underWaterInput/index.tsx +++ b/apps/fo/app/store/underWaterInput/index.tsx @@ -2,6 +2,7 @@ import DataForm from "@/app/components/common/DataForm"; import type { TableUpperProps } from "../dashboard"; import { getFetch } from "@/app/components/api"; import type { ExcelType, UnderWaterInputModalProps, UnderWaterProps } from "./types"; +import { start } from "repl"; export type { TableUpperProps }; // SewageOccurDetailProps 타입을 여기에 정의 @@ -201,7 +202,7 @@ const fetchUnderWaterList = async (pageNo: number, pageSize: number, searchYear: ====================================*/ export type UnderWaterActions = { searchUnderWaterList: (pageNo: number, pageSize: number, searchYear: string, part?: string, nameCd?: string, fcltCpct?: string, operationValue?: string, fcltyNm?: string) => void; - unserWaterModal:(bscFctCd:string, searchYear:string)=>void + unserWaterModal:(bscFctCd:string, searchYear:string, startYm:string, endYm:string)=>void } export type UnderWaterType = { @@ -365,6 +366,11 @@ export const underWaterReducer:(set:(fn: (state: UnderWaterType) => UnderWaterTy const summerUsage = sumSummerChungcunFlow / sumSummerChungcunDay; const winterUsage = sumWinterChungcunFlow / sumWinterChungcunDay; + if(bscFctCd === '11200PB001R') { + console.log('calData.length : ', calData.length); + console.log('usage : ', usage, 'summerUsage : ', summerUsage, 'winterUsage : ', winterUsage); + } + item.underWaterInputYear = Math.round((usage-(usage*0.65*0.8)) * 100) / 100; item.underWaterInputSummer = Math.round((summerUsage-(summerUsage*0.65*0.8)) * 100) / 100; item.underWaterInputWinter = Math.round((winterUsage-(winterUsage*0.65*0.8)) * 100) / 100; @@ -418,25 +424,19 @@ export const underWaterReducer:(set:(fn: (state: UnderWaterType) => UnderWaterTy }, })) }, - unserWaterModal:async (bscFctCd, searchYear)=>{ - console.log('searchYear : ', searchYear); + + unserWaterModal:async (bscFctCd, searchYear, startYm, endYm)=>{ const res = await getFetch('fo', '/fclt/flow/' + bscFctCd + '/' + searchYear); const monthData: SewageOccurDetailProps[] = []; const calData = calRainEffectDay(res.data, 'SUNNY'); - let tot = 0, cnt= 0; - - let tmpTot = 0; - - calData.forEach((item: FlowDataItem) => { - tmpTot += Number(item.inflAmnt); - }) - console.log('tmpTot : ', tmpTot/calData.length); + let tot = 0; + let cnt = 0; calData.forEach((item: FlowDataItem) => { const month = item.msrDt?.substring(4, 6); const monthIdx = month ? Number(month) - 1 : -1; - if (monthIdx >= 0) { + if (monthIdx >= 0 && (monthIdx>=Number(startYm.substring(4,6))-1 && monthIdx <= Number(endYm.substring(4, 6))-1)) { if (typeof monthData[monthIdx] === 'object') { monthData[monthIdx].sum += Number(item.inflAmnt); monthData[monthIdx].cnt++; @@ -444,9 +444,12 @@ export const underWaterReducer:(set:(fn: (state: UnderWaterType) => UnderWaterTy monthData[monthIdx] = {cnt:1, sum:Number(item.inflAmnt), yr:item.msrDt.substring(0,4), usege:0}; } } - tot += Number(item.inflAmnt) - cnt++ - }) + + if(month >= startYm.substring(4, 6) && month <= endYm.substring(4, 6)){ + cnt++; + tot += item.inflAmnt && item.inflAmnt !== 'x' ? Number(item.inflAmnt.toString().trim()) : 0; + } + }); const tableData:UnderWaterInputModalProps[] = [] let maxWaterUsage = 0; @@ -469,13 +472,16 @@ export const underWaterReducer:(set:(fn: (state: UnderWaterType) => UnderWaterTy } }); - avgWaterUsage = tot/cnt + console.log('tot', tot, 'calData.length', calData.length); + avgWaterUsage = tot/cnt; + console.log(avgWaterUsage); const newData= [ { msrDt: '평균', realSewageInput:Math.round(avgWaterUsage*100) /100, sewageOccur:Math.round(avgWaterUsage*0.65*0.8 * 100) / 100, - underWaterInput:Math.round((avgWaterUsage-(avgWaterUsage*0.65*0.8)) * 100) / 100, + underWaterInput: Math.round((avgWaterUsage-(avgWaterUsage*0.65*0.8)) * 100) / 100 + //underWaterInput:Math.round((avgWaterUsage-(avgWaterUsage*0.65*0.8)) * 100) / 100, }, { msrDt: '최대',