diff --git a/apps/fo/app/store/facilityPrecipitation/index.tsx b/apps/fo/app/store/facilityPrecipitation/index.tsx index f7a716349..39bc35220 100644 --- a/apps/fo/app/store/facilityPrecipitation/index.tsx +++ b/apps/fo/app/store/facilityPrecipitation/index.tsx @@ -1,5 +1,5 @@ -import { getFetch } from "@/app/components/api"; -import CalcRainEffect from "@/app/components/common/CalcRainEffect"; +import { getFetch, postFetch } from "@/app/components/api"; +//import CalcRainEffect from "@/app/components/common/CalcRainEffect"; import { roundNumber } from "@/app/components/common/DataForm"; import type { TableUpperProps } from "../dashboard"; export type { TableUpperProps }; @@ -130,47 +130,109 @@ const upHeadListPrecipitationDetail:TableUpperProps[] = [ const gridListPrecipitationDetail:PrecipitationPropsDetailProps[] = [ ] +export interface FacilityRainDetailProps { + bscFctCd: string, // 시설코드 + rainDt: string, // 측정일 + stnKo: string, // 관측소명 + infoRnDay: number | string | '', // 강수량 (mm/일) + rainDay: number, // 강우일 (일) + rainEffectDay: number, // 강우영향일 (일) +} + /**==================================== * Store - api ====================================*/ +// 시설정보 목록 [] +export const fetchFacilityRainDetailList = async (searchYear: string|undefined, fcltCdList: string[]): Promise => { + try { + const res = await postFetch('fo', '/fclt/rain/detail/'+searchYear, fcltCdList); + return res; + } catch (error) { + console.error('시설정보 목록 데이터를 가져오는데 실패했습니다:', error); + return null; + } +}; const fetchFacilityPrecipitationList = async (pageNo: number, pageSize: number, searchYear: string, part?: string, nameCd?: string, fcltCpct?: string, operationValue?: string, fcltyNm?: string) => { const tailStr = '/'+pageNo + '/' + pageSize + '/' + searchYear + (part?'/' + part:'' ) + (nameCd?'/' + nameCd:'' ) + (fcltCpct?'/' + fcltCpct:'' ) + (operationValue?'/' + operationValue:'' ) + (fcltyNm && fcltyNm !== '' ? '/' + fcltyNm : '') ; const url = '/fclt/rain' + tailStr; const res = await getFetch('fo', url); - const tmpData:PrecipitationPropsDetailProps[] = []; - if(res!= null && res.data.length > 0){ - for(let idx=0; idx=3?1:0; + - tmpData.push({ - bscFctCd : bscFctCd, - rainDt : rainDt, - infoRnDay : infoRnDay, - rainDay : rainDay, - rainEffectDay : rainDay - }) + const fcltCdList : string[]= []; + res?.data.forEach(item => { + fcltCdList.push(item.bscFctCd); + }); + + const rainDetailListRes: Record = {}; + const promises: Promise[] = []; + for (let idx = 0; idx < fcltCdList.length; idx += 100) { + const slicedItems = fcltCdList.slice(idx, idx + 100); + // 각 fetch 호출을 Promise 배열에 담기 + promises.push(fetchFacilityRainDetailList(searchYear, slicedItems)); + } + // 모든 요청을 병렬로 실행 + const results = await Promise.all(promises); + //console.log(results); + // 결과를 합치기 + for (const res of results) { + if (res.status === 200 && res.data) { + for (const [key, value] of Object.entries(res.data)) { + const keyStr = String(key); + rainDetailListRes[keyStr] = [...(rainDetailListRes[keyStr] || []), ...(value as any[])]; } } - - res.data.map((item: FacilityPrecipitationProps) => { - const filteredList = tmpData.filter((gridItem) => { - return gridItem.bscFctCd === item.bscFctCd; - }); - - const rtnData = CalcRainEffect(filteredList); - item.rainEffectDay = rtnData.reduce((acc, curr) => acc + curr.rainEffectDay, 0); - item.totalYearRain = rtnData.reduce((acc, curr) => acc + Number(curr.infoRnDay), 0); - item.infoRnDay = filteredList.reduce((acc, curr) => acc + curr.rainDay, 0); - }); - } + //console.log(rainDetailListRes); - return { data: res.data, count: res.count, detailData: tmpData }; + const tmpData:PrecipitationPropsDetailProps[] = []; + + for (const item of res?.data) { + const rainDetailList = rainDetailListRes[item.bscFctCd]; + + let rainDayCnt = 0; // 강우일수 + let rainEffectDayCnt = 0; // 강우영향일수 + let totalRain = 0; // 총강수량 + if (rainDetailList) { + item.stnKo = rainDetailList[0]?.stnKo || ''; // 관측소명 + + let rainEffectDayEval = 0; // 강우영향일 평가 변수 + rainDetailList.forEach(item2 => { + + if (item2.infoRnDay == null) item2.infoRnDay = 0; + if (item2.infoRnDay >= 3) { // 강우량이 3mm 이상인 경우 강우일 + rainEffectDayEval = 2; + item2.rainDay = 1; + rainDayCnt++; // 강우일수 증가 + } else { + rainEffectDayEval--; + item2.rainDay = 0; + } + + if (rainEffectDayEval < 0) { // 청천일 + item2.rainEffectDay = 0; + } else { // 강우영향일 + item2.rainEffectDay = 1; + rainEffectDayCnt++; // 강우영향일수 증가 + } + totalRain += Number(item2.infoRnDay); + item2.rainDt = item2.rainDt; + tmpData.push({ + bscFctCd: item.bscFctCd, + rainDt: item2.rainDt.substring(0,10), + infoRnDay: item2.infoRnDay, + rainEffectDay: item2.rainEffectDay, + rainDay: item2.rainDay + }); + }); + item.infoRnDay = rainDayCnt; + item.rainEffectDay = rainEffectDayCnt; + item.totalYearRain = totalRain; + item.rainDetailList = rainDetailList; + } + } + + return { data: res.data, count: res.count, detailData: tmpData}; } /**==================================== diff --git a/apps/fo/app/store/rdi/index.tsx b/apps/fo/app/store/rdi/index.tsx index 6fd287432..92cedd301 100644 --- a/apps/fo/app/store/rdi/index.tsx +++ b/apps/fo/app/store/rdi/index.tsx @@ -184,8 +184,10 @@ const fetchRdiList = async (pageNo: number, pageSize: number, searchYear: string item.rdiiValue = ''; item.infoRnDay = ''; item.properYn = ''; - item.sido = item.lclgvrnmntNm.split(' ')[0]?.toString() || ''; - item.sigungo = item.lclgvrnmntNm.split(' ')[1]?.toString() || ''; + // item.sido = item.lclgvrnmntNm.split(' ')[0]?.toString() || ''; + // item.sigungo = item.lclgvrnmntNm.split(' ')[1]?.toString() || ''; + item.sido = item.sido; + item.sigungo = item.gugun; }); return { data: res.data, count: res.count } }catch(error){ @@ -307,8 +309,10 @@ export const rdiReducer:(set:SetStateFunction)=>RdiActions=(set: SetStateFunctio const rtnData = res.data.map((item: RdiProps) => { return { ...item, - sido: item.lclgvrnmntNm.split(' ')[0]?.toString() || '', - sigungo: item.lclgvrnmntNm.split(' ')[1]?.toString() || '', + //sido: item.lclgvrnmntNm.split(' ')[0]?.toString() || '', + //sigungo: item.lclgvrnmntNm.split(' ')[1]?.toString() || '', + sido: item.sido, + sigungo : item.gugun, inflAmnt: item.inflAmnt?Number(item.inflAmnt).toFixed(1): '' // 유입유량 (강우량) } }) @@ -427,7 +431,7 @@ export const rdiReducer:(set:SetStateFunction)=>RdiActions=(set: SetStateFunctio 환경청: item.rgnNm, 시설명: item.bscFctNm, 시도: item.sido, - 시군구: item.sigungo, + 시군구: item.gugun, 주소: item.daddr, "시설용량(m³/일)": item.fctCpc, "청천시유입하수량(m³/일)": item.chungchunFlow, diff --git a/apps/wr/app/(with-layout)/matMng/coMat/coMatRvw/page.tsx b/apps/wr/app/(with-layout)/matMng/coMat/coMatRvw/page.tsx index d4e16b676..248f8f5e0 100644 --- a/apps/wr/app/(with-layout)/matMng/coMat/coMatRvw/page.tsx +++ b/apps/wr/app/(with-layout)/matMng/coMat/coMatRvw/page.tsx @@ -723,6 +723,12 @@ export default function CoMatRvw() { ))} + + + +
+

표준공사비 산정

+
sgg.text == item.sggNm)?.text } }) + .sort((a, b) => { + // ctpvCd 기준 1차 정렬 + const ctpvCompare = (a.ctpvCd || '').localeCompare(b.ctpvCd || ''); + if (ctpvCompare !== 0) return ctpvCompare; + + // sggNm 기준 2차 정렬 + return (a.sggNm || '').localeCompare(b.sggNm || ''); + }); + const data = Array.isArray(resData) ? resData.map((item: customDrgt) => { return { diff --git a/apps/wr/components/ui/form/coMat/conCostForm/conCostForm.tsx b/apps/wr/components/ui/form/coMat/conCostForm/conCostForm.tsx index dcb0f0b65..186e0bb77 100644 --- a/apps/wr/components/ui/form/coMat/conCostForm/conCostForm.tsx +++ b/apps/wr/components/ui/form/coMat/conCostForm/conCostForm.tsx @@ -301,12 +301,12 @@ export default function ConCostForm({ return ( <> -
+
-

+ {/*

표준공사비 산정 -

-
+ */} +

처리시설 표준공사비 산정