diff --git a/apps/fo/app/components/common/CalcRainEffect.tsx b/apps/fo/app/components/common/CalcRainEffect.tsx index bc989b264..1ed7abaf3 100644 --- a/apps/fo/app/components/common/CalcRainEffect.tsx +++ b/apps/fo/app/components/common/CalcRainEffect.tsx @@ -4,11 +4,12 @@ * 1.강우영향일 및 강우량을 계산하며 강우량이 3이상이면 강우영향일이며 이후 이틀까지 강우영향일로 포함 * * 2.강우영향일이면서 3mm이하의 강우량일 경우에는 강우영향을 준 날의 강우량을 따름 - * @param data + * @param data + * @param weather (default:ALL) * @author jsyang */ -export default function CalcRainEffect(data : any) { +export default function CalcRainEffect(data : any, weather? : string | 'ALL') { console.log("%c Calculate RainEffect ! ", "background:blue;color:white"); // 강우영향일 계산 (강우량이 3 초과이면 무조건 강우영향일) for(let idx = 0; idx < data.length; idx++) { @@ -50,5 +51,14 @@ export default function CalcRainEffect(data : any) { } } } - return data; + + let rtnData : any = []; + if (weather === 'ALL') { + rtnData = data; + } else if (weather === 'SUNNY') { + rtnData = data.filter((item: any) => item.rainEffectDay === 0); + } else { + rtnData = data.filter((item: any) => item.rainEffectDay === 1); + } + return rtnData; } \ No newline at end of file diff --git a/apps/fo/app/store/rdi/index.tsx b/apps/fo/app/store/rdi/index.tsx index a739cd05e..8160ade2e 100644 --- a/apps/fo/app/store/rdi/index.tsx +++ b/apps/fo/app/store/rdi/index.tsx @@ -1,8 +1,9 @@ import { getFetch } from "@/app/components/api"; +import CalcRainEffect from "@/app/components/common/CalcRainEffect"; import DataForm from "@/app/components/common/DataForm"; import type { TableUpperProps } from "../dashboard"; import { fetchFacilityWaterQltyListHist } from "../facilityWaterQlty"; -import { calRainEffectDay } from "../underWaterInput"; +import type { FlowResponse } from "../sewageOccur"; export type { TableUpperProps }; /**==================================== * Store - 타입 @@ -30,6 +31,9 @@ export type RdiProps = { lgbsn : string, mdmbsn : string, rainEffectDay : number, // 강우영향일 + chungchunFlow : string | number | '', + rainCalInflAmnt : string | number | '', + properYn : string, } export interface RdiInterface { @@ -49,6 +53,10 @@ export interface RdiInterface { rvbsn : string, lgbsn : string, mdmbsn : string, + rainEffectDay : number, // 강우영향일 + chungchunFlow : string | number | '', + rainCalInflAmnt : string | number | '', + properYn : string, } // 모달 @@ -80,11 +88,14 @@ export interface ExcelType { 시설명: string, 주소: string, 시설용량: number, + 청천시유입하수량: string | number | '', 하절기강우일최저유입BOD: number | '', 하절기최저유입BOD유입유량: number | string | '', 동절기청천시유입BOD: number | '', RDII추정 : number | '', RDII추정시일강수량 : number | '', + 강우시총추정유입량 : string | number | '', + 적정여부 : string, } // 리스트 헤더 @@ -95,6 +106,7 @@ const upHeadList1:TableUpperProps[] = [ { id: "bscFctNm", title: "시설명", row:0, rowSpan:2 }, { id: "daddr", title: "주소", row:0, rowSpan:2 }, { id: "fctCpc", title: "시설용량\n(m³/일)", align:"right", row:0, rowSpan:2 }, + { id: "chungchunFlow", title: "청천시 유입하수량\n(m³/일)", align:"right", row:0, rowSpan:2 }, { id: "B", title: "하절기 운영현황(6~8월)", row:0, colSpan:2 }, { id: "summerMinBodValue", title: "3mm 이상 강우일 중 최저 유입BOD\n(mg/L)", align:"right", row:1 }, { id: "inflAmnt", title: "하절기최저유입BOD유입유량\n(m³/일)", row:1, align:"right" }, @@ -102,6 +114,8 @@ const upHeadList1:TableUpperProps[] = [ { id: "winterAvgBodLowRainfall", title: "청천시 유입BOD\n(mg/L)", row:1, align:"right" }, { id: "rdiiValue", title: "RDII추정", row:0, rowSpan:2, align:"right" }, { id: "infoRnDay", title: "RDII추정시일강수량\n(mm)", row:0, rowSpan:2, align:"right" }, + { id: "rainCalInflAmnt", title: "강우시 총 추정유입량\n(m³/일)", row:0, rowSpan:2, align:"right" }, + { id: "properYn", title: "적정여부", row:0, rowSpan:2 }, ]; const upHeadList2:TableUpperProps[] = [ @@ -112,6 +126,7 @@ const upHeadList2:TableUpperProps[] = [ { id: "bscFctNm", title: "시설명", row:0, rowSpan:2 }, { id: "daddr", title: "주소", row:0, rowSpan:2 }, { id: "fctCpc", title: "시설용량(m³/일)", align:"right", row:0, rowSpan:2 }, + { id: "chungchunFlow", title: "청천시 유입하수량\n(m³/일)", align:"right", row:0, rowSpan:2 }, { id: "B", title: "하절기 운영현황(6~8월)", row:0, colSpan:2 }, { id: "summerMinBodValue", title: "하절기강우일최저유입BOD", align:"right", row:1 }, { id: "inflAmnt", title: "하절기최저유입BOD유입유량", row:1, align:"right" }, @@ -119,6 +134,8 @@ const upHeadList2:TableUpperProps[] = [ { id: "winterAvgBodLowRainfall", title: "동절기청천시유입BOD", row:1, align:"right" }, { id: "rdiiValue", title: "RDII추정", row:0, rowSpan:2, align:"right" }, { id: "infoRnDay", title: "RDII추정시일강수량", row:0, rowSpan:2, align:"right" }, + { id: "rainCalInflAmnt", title: "강우시 총 추정유입량\n(m³/일)", row:0, rowSpan:2, align:"right" }, + { id: "properYn", title: "적정여부", row:0, rowSpan:2 }, ]; const upHeadList3:TableUpperProps[] = [ @@ -133,6 +150,7 @@ const upHeadList3:TableUpperProps[] = [ { id: "bscFctNm", title: "시설명", row:0, rowSpan:2 }, { id: "daddr", title: "주소", row:0, rowSpan:2 }, { id: "fctCpc", title: "시설용량(m³/일)", align:"right", row:0, rowSpan:2 }, + { id: "chungchunFlow", title: "청천시 유입하수량\n(m³/일)", align:"right", row:0, rowSpan:2 }, { id: "C", title: "하절기 운영현황(6~8월)", row:0, colSpan:2 }, { id: "summerMinBodValue", title: "하절기강우일최저유입BOD", align:"right", row:1 }, { id: "inflAmnt", title: "하절기최저유입BOD유입유량", row:1, align:"right" }, @@ -140,6 +158,8 @@ const upHeadList3:TableUpperProps[] = [ { id: "winterAvgBodLowRainfall", title: "동절기청천시유입BOD", row:1, align:"right" }, { id: "rdiiValue", title: "RDII추정", row:0, rowSpan:2, align:"right" }, { id: "infoRnDay", title: "RDII추정시일강수량", row:0, rowSpan:2, align:"right" }, + { id: "rainCalInflAmnt", title: "강우시 총 추정유입량\n(m³/일)", row:0, rowSpan:2, align:"right" }, + { id: "properYn", title: "적정여부", row:0, rowSpan:2 }, ]; const rdiList:RdiProps[] = [ @@ -153,7 +173,6 @@ const fetchRdiList = async (pageNo: number, pageSize: number, searchYear: string try{ const tailStr = partCd ? '/'+ partCd + '/' + nameCd + '/' + fcltCpct + '/' + operationValue + (fcltyNm && fcltyNm !== '' ? '/' + fcltyNm : '') : ''; const url = '/rdii/list/' + pageNo + '/' + pageSize + '/' + searchYear + tailStr; - console.log(url); const res = await getFetch('fo', url); return { data: res.data, count: res.count } }catch(error){ @@ -212,6 +231,8 @@ const dataFormSetting=(item : RdiProps)=> { DataForm({ type: 'float0', column: 'rdiiValue', item: item as unknown as Record}); DataForm({ type: 'float1', column: 'infoRnDay', item: item as unknown as Record}); DataForm({ type: 'float0', column: 'inflAmnt', item: item as unknown as Record}); + DataForm({ type: 'float0', column: 'chungchunFlow', item: item as unknown as Record}); + DataForm({ type: 'float0', column: 'rainCalInflAmnt', item: item as unknown as Record}); } // Add type definitions for state setter function @@ -232,9 +253,32 @@ export const rdiReducer:(set:SetStateFunction)=>RdiActions=(set: SetStateFunctio const res = await fetchRdiList(pageNo, pageSize, searchYear, partCd, nameCd, fcltCpct, operationValue, fcltyNm); const data = res.data; - const excelDownList: ExcelType[] = []; + const reData = await Promise.all(data.map(async (item: RdiProps) => { + const bscFctCd = item.bscFctCd; + const res2 = await getFetch('fo', '/fclt/flow/' + bscFctCd + '/' + searchYear) as FlowResponse; + const calData = CalcRainEffect(res2.data, 'SUNNY'); + let avgChungcunSumFlow = 0; + let chungcunSumFlow = 0; - const rtnData = data.map((item: RdiProps) => { + calData.forEach((flowItem: any) => { + chungcunSumFlow += flowItem.inflAmnt && flowItem.inflAmnt !== 'x' ? Number(flowItem.inflAmnt.toString().trim()) : 0; + /* if(flowItem.msrDt.substring(4,6) ==='06' || flowItem.msrDt.substring(4,6) ==='07' || flowItem.msrDt.substring(4,6) ==='08'){ + sumSummerChungcunDay += 1; + sumSummerChungcunFlow += flowItem.inflAmnt && flowItem.inflAmnt !== 'x' ? Number(flowItem.inflAmnt.toString().trim()) : 0; + }else if(flowItem.msrDt.substring(4,6) ==='01' || flowItem.msrDt.substring(4,6) ==='02'){ + sumWinterChungcunDay += 1; + sumWinterChungcunFlow += flowItem.inflAmnt && flowItem.inflAmnt !== 'x' ? Number(flowItem.inflAmnt.toString().trim()) : 0; + } */ + }); + avgChungcunSumFlow = chungcunSumFlow&&chungcunSumFlow>0?chungcunSumFlow / calData.length : 0; + item.chungchunFlow = avgChungcunSumFlow; + item.rainCalInflAmnt = Number(avgChungcunSumFlow) - Number(item.rdiiValue); + item.properYn = Number(item.rainCalInflAmnt) > Number(item.fctCpc) ? '초과유입' : '적정' + return item; + })); + + const excelDownList: ExcelType[] = []; + const rtnData = reData.map((item: RdiProps) => { return { ...item, sido: item.lclgvrnmntNm.split(' ')[0]?.toString() || '', @@ -256,9 +300,9 @@ export const rdiReducer:(set:SetStateFunction)=>RdiActions=(set: SetStateFunctio dataItem.rainEffectDay = 0; }); - calRainEffectDay(rtnWqltData, 'SUNNY'); + const calcData = CalcRainEffect(rtnWqltData, 'SUNNY'); - const rtnWqltWinterData = rtnWqltData.filter((dataItem: any) => + const rtnWqltWinterData = calcData.filter((dataItem: any) => (dataItem.msrDt.substring(4, 6) === '01' || dataItem.msrDt.substring(4, 6) === '02') && dataItem.rainEffectDay == 0 @@ -295,11 +339,14 @@ export const rdiReducer:(set:SetStateFunction)=>RdiActions=(set: SetStateFunctio 시군구: item.sigungo, 주소: item.daddr, 시설용량: item.fctCpc, + 청천시유입하수량: item.chungchunFlow, 하절기강우일최저유입BOD: item.summerMinBodValue, 하절기최저유입BOD유입유량: item.inflAmnt, 동절기청천시유입BOD: item.winterAvgBodLowRainfall, - RDII추정 : item.rdiiValue, - RDII추정시일강수량 : item.infoRnDay, + RDII추정: item.rdiiValue, + RDII추정시일강수량: item.infoRnDay, + 강우시총추정유입량: item.rainCalInflAmnt, + 적정여부: item.properYn, }); }); } diff --git a/apps/fo/app/store/underWaterInput/index.tsx b/apps/fo/app/store/underWaterInput/index.tsx index e9c664b99..fb064deef 100644 --- a/apps/fo/app/store/underWaterInput/index.tsx +++ b/apps/fo/app/store/underWaterInput/index.tsx @@ -2,6 +2,7 @@ import { getFetch } from "@/app/components/api"; import DataForm from "@/app/components/common/DataForm"; import type { TableUpperProps } from "../dashboard"; import type { ExcelType, UnderWaterInputModalProps, UnderWaterProps } from "./types"; +import CalcRainEffect from "@/app/components/common/CalcRainEffect"; export type { TableUpperProps }; // SewageOccurDetailProps 타입을 여기에 정의 @@ -38,10 +39,12 @@ const upHeadList1:TableUpperProps[] = [ { id: "bscFctNm", title: "시설명", row:0, rowSpan:2 }, { id: "daddr", title: "주소", row:0, rowSpan:2 }, { id: "fctCpc", title: "시설용량(m³/일)", align:"right", row:0, rowSpan:2 }, + { id: "inflAmnt", title: "평균유입하수량(m³/일)", align:"right", row:0, rowSpan:2 }, { id: "C", title: "지하수 유입량 추정", align:"right", row:0, colSpan:3 }, { id: "underWaterInputYear", title: "연간\n(m³/일)", align:"right", row:1 }, { id: "underWaterInputSummer", title: "하절기\n(m³/일)", align:"right", row:1 }, { id: "underWaterInputWinter", title: "동절기\n(m³/일)", align:"right", row:1 }, + { id: "properYn", title: "적정여부", row:0, rowSpan:2 }, ]; const upHeadList2:TableUpperProps[] = [ @@ -52,10 +55,12 @@ const upHeadList2:TableUpperProps[] = [ { id: "bscFctNm", title: "시설명", row:0, rowSpan:2 }, { id: "daddr", title: "주소", row:0, rowSpan:2 }, { id: "fctCpc", title: "시설용량(m³/일)", align:"right", row:0, rowSpan:2 }, + { id: "inflAmnt", title: "평균유입하수량(m³/일)", align:"right", row:0, rowSpan:2 }, { id: "C", title: "지하수 유입량 추정", align:"right", row:0, colSpan:3 }, { id: "underWaterInputYear", title: "연간\n(m³/일)", align:"right", row:1 }, { id: "underWaterInputSummer", title: "하절기\n(m³/일)", align:"right", row:1 }, { id: "underWaterInputWinter", title: "동절기\n(m³/일)", align:"right", row:1 }, + { id: "properYn", title: "적정여부", row:0, rowSpan:2 }, ]; const upHeadList3:TableUpperProps[] = [ @@ -70,10 +75,12 @@ const upHeadList3:TableUpperProps[] = [ { id: "bscFctNm", title: "시설명", row:0, rowSpan:2 }, { id: "daddr", title: "주소", row:0, rowSpan:2 }, { id: "fctCpc", title: "시설용량(m³/일)", align:"right", row:0, rowSpan:2 }, + { id: "inflAmnt", title: "평균유입하수량(m³/일)", align:"right", row:0, rowSpan:2 }, { id: "C", title: "지하수 유입량 추정", align:"right", row:0, colSpan:3 }, { id: "underWaterInputYear", title: "연간\n(m³/일)", align:"right", row:1 }, { id: "underWaterInputSummer", title: "하절기\n(m³/일)", align:"right", row:1 }, { id: "underWaterInputWinter", title: "동절기\n(m³/일)", align:"right", row:1 }, + { id: "properYn", title: "적정여부", row:0, rowSpan:2 }, ]; // 모달 @@ -251,6 +258,7 @@ export const underWaterInitState: UnderWaterType = { const dataFormSetting=(item : UnderWaterProps)=> { DataForm({ type: 'float0', column: 'fctCpc', item: item as unknown as Record }); + DataForm({ type: 'float0', column: 'inflAmnt', item: item as unknown as Record }); DataForm({ type: 'float0', column: 'underWaterInputYear', item: item as unknown as Record}); DataForm({ type: 'float0', column: 'underWaterInputSummer', item: item as unknown as Record}); DataForm({ type: 'float0', column: 'underWaterInputWinter', item: item as unknown as Record}); @@ -258,65 +266,6 @@ const dataFormSetting=(item : UnderWaterProps)=> { export type UnderWaterStore = UnderWaterType & UnderWaterActions; -/** - * - * @param data - * @param weather ('ALL' | 'SUNNY' | 'RAINY') - * @returns - */ -export const calRainEffectDay = (data: any, weather: string) => { - // 강우영향일 계산 (강우량이 3 이상이면 무조건 강우영향일) - for(let idx = 0; idx < data.length; idx++) { - const item = data[idx]; - if(item){ - if(item.infoRnDay && Number(item.infoRnDay.toString().trim()) >= 3) { - item.rainEffectDay = 1; - } else { - item.rainEffectDay = 0; - } - } - } - - // 이틀 전, 하루 전이 강우영향일(3 이상)인 경우 해당 날도 강우영향일로 설정 - for(let idx = 0; idx < data.length; idx++) { - if(data[idx]) { - // 하루 전이 강우영향일(3 이상)인 경우 - if(idx > 0 && data[idx-1]?.infoRnDay && Number(data[idx-1]?.infoRnDay.toString().trim()) >= 3) { - data[idx]!.rainEffectDay = 1; - } - // 이틀 전이 강우영향일(3 이상)인 경우 - if(idx > 1 && data[idx-2]?.infoRnDay && Number(data[idx-2]?.infoRnDay.toString().trim()) >= 3) { - data[idx]!.rainEffectDay = 1; - } - } - } - - for(let idx = 0; idx < data.length; idx++) { - if(data[idx] && data[idx]?.rainEffectDay === 1) { - if(idx > 1){ - if(data[idx-1]?.infoRnDay && Number(data[idx]?.infoRnDay) < 3 && Number(data[idx-1]?.infoRnDay.toString().trim()) >= 3) { - data[idx]!.infoRnDay = data[idx-1]!.infoRnDay; - } - } - if(idx > 2){ - if(data[idx-2]?.infoRnDay && Number(data[idx]?.infoRnDay) < 3 && Number(data[idx-2]?.infoRnDay.toString().trim()) >= 3) { - data[idx]!.infoRnDay = data[idx-2]!.infoRnDay; - } - } - } - } - - let rtnData : FlowDataItem[] = []; - if (weather === 'ALL') { - rtnData = data; - } else if (weather === 'SUNNY') { - rtnData = data.filter((item: FlowDataItem) => item.rainEffectDay === 0); - } else { - rtnData = data.filter((item: FlowDataItem) => item.rainEffectDay === 1); - } - return rtnData; -} - export const underWaterReducer:(set:(fn: (state: UnderWaterType) => UnderWaterType) => void)=>UnderWaterActions=(set: (fn: (state: UnderWaterType) => UnderWaterType) => void) => { return { searchUnderWaterList: async (pageNo: number, pageSize: number, searchYear: string, part?: string, nameCd?: string, fcltCpct?: string, operationValue?: string, fcltyNm?: string) => { @@ -337,7 +286,7 @@ export const underWaterReducer:(set:(fn: (state: UnderWaterType) => UnderWaterTy const bscFctCd = item.bscFctCd; const res2 = await getFetch('fo', '/fclt/flow/' + bscFctCd + '/' + searchYear) as ApiResponse; - const calData = calRainEffectDay(res2.data, 'SUNNY'); + const calData = CalcRainEffect(res2.data, 'SUNNY'); let chungcunSumFlow = 0; let sumSummerChungcunDay = 0; @@ -370,7 +319,7 @@ export const underWaterReducer:(set:(fn: (state: UnderWaterType) => UnderWaterTy item.underWaterInputYear = Math.round((usage-(usage*0.65*0.9)) * 1) / 1; item.underWaterInputSummer = Math.round((summerUsage-(summerUsage*0.65*0.9)) * 1) / 1; item.underWaterInputWinter = Math.round((winterUsage-(winterUsage*0.65*0.9)) * 1) / 1; - + item.properYn = Math.round( (Number(usage-(usage*0.65*0.9)) / Number(item.inflAmnt)) * 100 * 1 ) / 1 > 20?'초과유입':'적정'; return item; })); @@ -392,10 +341,11 @@ export const underWaterReducer:(set:(fn: (state: UnderWaterType) => UnderWaterTy 시설명: item.bscFctNm, 주소: item.daddr, 시설용량: item.fctCpc, + 평균유입하수량 :item.inflAmnt, 연간지하수유입량: item.underWaterInputYear, 하절기지하수유입량: item.underWaterInputSummer, 동절기지하수유입량: item.underWaterInputWinter, - + 적정여부: item.properYn, }); }); }else{ @@ -425,7 +375,7 @@ export const underWaterReducer:(set:(fn: (state: UnderWaterType) => UnderWaterTy const res = await getFetch('fo', '/fclt/flow/' + bscFctCd + '/' + searchYear); const monthData: SewageOccurDetailProps[] = []; - const calData = calRainEffectDay(res.data, 'SUNNY'); + const calData = CalcRainEffect(res.data, 'SUNNY'); let tot = 0; let cnt = 0; diff --git a/apps/fo/app/store/underWaterInput/types.tsx b/apps/fo/app/store/underWaterInput/types.tsx index c90c654ad..4e13e7c96 100644 --- a/apps/fo/app/store/underWaterInput/types.tsx +++ b/apps/fo/app/store/underWaterInput/types.tsx @@ -14,6 +14,8 @@ export type UnderWaterProps = { rvbsn : string, lgbsn : string, mdmbsn : string, + inflAmnt : number | '', + properYn : string | '', } export interface UnderWaterInterface { bscFctCd : string, @@ -30,6 +32,8 @@ export interface UnderWaterInterface { rvbsn : string, lgbsn : string, mdmbsn : string, + inflAmnt : number | '', + properYn : string | '', } // 모달 @@ -52,7 +56,9 @@ export interface ExcelType { 시설명: string, 주소: string, 시설용량: number, + 평균유입하수량 : number | '', 연간지하수유입량: number | '', 하절기지하수유입량: number | '', 동절기지하수유입량: number | '', + 적정여부: string | '', } \ No newline at end of file