rdii 개선

This commit is contained in:
2025-08-20 16:52:19 +09:00
parent 4e7d291ad9
commit fda8750f14
4 changed files with 87 additions and 74 deletions
@@ -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;
}
+55 -8
View File
@@ -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<string, unknown>});
DataForm({ type: 'float1', column: 'infoRnDay', item: item as unknown as Record<string, unknown>});
DataForm({ type: 'float0', column: 'inflAmnt', item: item as unknown as Record<string, unknown>});
DataForm({ type: 'float0', column: 'chungchunFlow', item: item as unknown as Record<string, unknown>});
DataForm({ type: 'float0', column: 'rainCalInflAmnt', item: item as unknown as Record<string, unknown>});
}
// 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,
});
});
}
+13 -63
View File
@@ -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<string, unknown> });
DataForm({ type: 'float0', column: 'inflAmnt', item: item as unknown as Record<string, unknown> });
DataForm({ type: 'float0', column: 'underWaterInputYear', item: item as unknown as Record<string, unknown>});
DataForm({ type: 'float0', column: 'underWaterInputSummer', item: item as unknown as Record<string, unknown>});
DataForm({ type: 'float0', column: 'underWaterInputWinter', item: item as unknown as Record<string, unknown>});
@@ -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;
@@ -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 | '',
}