377 lines
16 KiB
TypeScript
377 lines
16 KiB
TypeScript
import { getFetch } from "@/app/components/api";
|
|
import type { TableUpperProps } from "../dashboard";
|
|
import DataForm, { roundNumber } from "@/app/components/common/DataForm";
|
|
import CalcRainEffect from "@/app/components/common/CalcRainEffect";
|
|
import { fetchFacilityWaterQltyListHist } from "../facilityWaterQlty";
|
|
|
|
/**====================================
|
|
* Store - 타입
|
|
====================================*/
|
|
|
|
/**
|
|
* (1) 메인페이지
|
|
*/
|
|
const FlowRateSearchLabelArray:string[] = ['구분', '시도', '시군구', '용량별', '시설명', '조회기간', '시설상태', '권역', '단위유역', '중권역', '환경청별'];
|
|
|
|
export type flowRateListProps = {
|
|
bscFctCd : string,
|
|
sido : string,
|
|
gugun : string,
|
|
bscFctNm : string,
|
|
daddr : string,
|
|
fctCpc : number,
|
|
lclgvrnmntNm : string,
|
|
totInflAmnt : number | '',
|
|
inflAmnt : number | '',
|
|
sumFlow : number | '',
|
|
returnAmnt : number | '',
|
|
efflAmnt : number | '',
|
|
rgnNm : string,
|
|
rvbsn : string,
|
|
lgbsn : string,
|
|
mdmbsn : string,
|
|
infoRnDay : number | '',
|
|
}
|
|
|
|
export interface ExcelType {
|
|
시설코드: string,
|
|
권역:string|'',
|
|
단위유역:string|'',
|
|
중권역:string|'',
|
|
환경청:string|'',
|
|
시도: string,
|
|
시군구: string,
|
|
시설이름: string,
|
|
주소: string,
|
|
"시설용량(m³/일)": number,
|
|
"총유입량(m³/일)": number | '',
|
|
"하수유입량(m³/일)": number | '',
|
|
"연계처리량(m³/일)": number | '',
|
|
"총인반류수량(m³/일)": number | '',
|
|
"방류량(m³/일)": number | '',
|
|
}
|
|
|
|
export type modalExcelType = {
|
|
"날짜": string,
|
|
"총유입량(m³/일)": number | '',
|
|
"하수유입량(m³/일)": number | '',
|
|
"연계처리량(m³/일)": number | '',
|
|
"총인반류수량(m³/일)": number | '',
|
|
"방류량(m³/일)": number | '',
|
|
/* "강우량(mm/일)": number | string | '', */
|
|
}
|
|
/**
|
|
* (2) 모달
|
|
*/
|
|
export interface FlowRateModalInterface {
|
|
msrDt : string,
|
|
totInflAmnt : number | '',
|
|
inflAmnt : number | '',
|
|
sumFlow : number | '',
|
|
returnAmnt : number | '',
|
|
efflAmnt : number | '',
|
|
infoRnDay : number | string | '',
|
|
rainEffectDay : number | string | '' ,
|
|
noProcessInflAmnt : number | string | ''
|
|
}
|
|
export type FlowRateModalProps = {
|
|
msrDt : string,
|
|
totInflAmnt : number,
|
|
inflAmnt : number,
|
|
sumFlow : number,
|
|
returnAmnt : number,
|
|
efflAmnt : number,
|
|
infoRnDay : number | string | '',
|
|
rainEffectDay : number | string | '',
|
|
noProcessInflAmnt : number | string | ''
|
|
}
|
|
|
|
/**====================================
|
|
* Store - data
|
|
====================================*/
|
|
|
|
/**
|
|
* (1) 메인페이지
|
|
*/
|
|
// 리스트 (행정별)
|
|
const upHeadList1:TableUpperProps[] = [
|
|
{ id: "A", title: "행정명", row: 0 ,colSpan: 2 },
|
|
{ id: "sido", title: "시도", upName:"upChangeRe", row:1 },
|
|
{ id: "gugun", title: "시군구", upName:"upChangeRe", row:1 },
|
|
{ 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: "totInflAmnt", title: "총 유입량\n(m³/일)", align:"right", row: 0, rowSpan: 2},
|
|
{ id: "inflAmnt", title: "하수유입량\n(m³/일)", align:"right", row: 0, rowSpan: 2},
|
|
{ id: "sumFlow", title: '연계처리량\n(m³/일)', align:"right", row: 0, rowSpan: 2},
|
|
{ id: "returnAmnt", title: '총인 반류수량\n(m³/일)', align:"right", row: 0, rowSpan: 2},
|
|
{ id: "efflAmnt", title: '방류량\n(m³/일)', align:"right", row: 0, rowSpan: 2}
|
|
];
|
|
|
|
// 리스트 (권역별)
|
|
const upHeadList2:TableUpperProps[] = [
|
|
{ id: "A", title: "유역", row: 0, colSpan: 3},
|
|
{ id: "rvbsn", title: "권역", upName:"upChangeRe", row:1 },
|
|
{ id: "lgbsn", title: "단위유역", upName:"upChangeRe", row:1 },
|
|
{ id: "mdmbsn", title: "중권역", upName:"upChangeRe", row:1 },
|
|
{ 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: "totInflAmnt", title: "총 유입량\n(m³/일)", align:"right", row: 0, rowSpan: 2},
|
|
{ id: "inflAmnt", title: "하수유입량\n(m³/일)", align:"right", row: 0, rowSpan: 2},
|
|
{ id: "sumFlow", title: '연계처리량\n(m³/일)', align:"right", row: 0, rowSpan: 2},
|
|
{ id: "returnAmnt", title: '총인 반류수량\n(m³/일)', align:"right", row: 0, rowSpan: 2},
|
|
{ id: "efflAmnt", title: '방류량\n(m³/일)', align:"right", row: 0, rowSpan: 2}
|
|
];
|
|
|
|
// 리스트 (환경청별별)
|
|
const upHeadList3:TableUpperProps[] = [
|
|
{ id: "A", title: "유역", row: 0, colSpan: 3 },
|
|
{ id: "rvbsn", title: "권역", upName:"upChangeRe1", row:1 },
|
|
{ id: "lgbsn", title: "단위유역", upName:"upChangeRe1", row:1 },
|
|
{ id: "mdmbsn", title: "중권역", upName:"upChangeRe1", row:1 },
|
|
{ id: "rgnNm", title: "환경청", row:0, rowSpan:2 },
|
|
{ id: "B", title: "행정명", row: 0 ,colSpan: 2 },
|
|
{ id: "sido", title: "시도", upName:"upChangeRe2", row:1 },
|
|
{ id: "gugun", title: "시군구", upName:"upChangeRe2", row:1 },
|
|
{ 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: "totInflAmnt", title: "총 유입량\n(m³/일)", align:"right", row: 0, rowSpan: 2 },
|
|
{ id: "inflAmnt", title: "하수유입량\n(m³/일)", align:"right", row: 0, rowSpan: 2 },
|
|
{ id: "sumFlow", title: '연계처리량\n(m³/일)', align:"right", row: 0, rowSpan: 2 },
|
|
{ id: "returnAmnt", title: '총인 반류수량\n(m³/일)', align:"right", row: 0, rowSpan: 2 },
|
|
{ id: "efflAmnt", title: '방류량\n(m³/일)', align:"right", row: 0, rowSpan: 2 }
|
|
];
|
|
|
|
const flowRateList:flowRateListProps[] = [
|
|
]
|
|
|
|
/**
|
|
* (2) 모달
|
|
*/
|
|
|
|
const upHeadListFlowRateModal:TableUpperProps[] = [
|
|
{ id: "msrDt", title: "날짜"},
|
|
{ id: "totInflAmnt", title: "총 유입량(m³/일)", align:"right"},
|
|
{ id: "inflAmnt", title: "하수유입량(m³/일)", align:"right"},
|
|
{ id: "sumFlow", title: "연계처리량(m³/일)", align:"right"},
|
|
{ id: "returnAmnt", title: "총인 반류수량(m³/일)", align:"right"},
|
|
{ id: "efflAmnt", title: "방류량(m³/일)", align:"right"},
|
|
{ id: "noProcessInflAmnt", title: "미처리하수량(m³/일)", align:"right"},
|
|
{ id: "infoRnDay", title: "강우량(mm/일)", align:"right"}
|
|
]
|
|
|
|
const modalFlowRateListYear:FlowRateModalProps[] = [
|
|
]
|
|
|
|
/**====================================
|
|
* Store - API
|
|
====================================*/
|
|
const fetchFlowRateList = async (pageNo: number, pageSize: number, searchYear: string, partCd?: string, nameCd?: string, fcltCpct?: string, operationValue?: string, fcltyNm?: string) => {
|
|
try {
|
|
const tailStr = partCd ? '/'+ partCd + '/' + nameCd + '/' + fcltCpct + '/' + operationValue + (fcltyNm && fcltyNm !== '' ? '/' + fcltyNm : '') : '';
|
|
const url = '/fclt/flow/' + pageNo + '/' + pageSize + '/' + searchYear + tailStr;
|
|
const res = await getFetch('fo', url);
|
|
return { data: res.data, count: res.count }
|
|
} catch (error) {
|
|
console.error('시설정보 유량현황 데이터를 가져오는데 실패했습니다:', error);
|
|
return { data: [], count: 0 };
|
|
}
|
|
}
|
|
|
|
export const fetchFlowRateModalList = async (bscFctCd: string, searchYear: string) => {
|
|
try {
|
|
const url = '/fclt/flow/' + bscFctCd + '/' + searchYear;
|
|
const res = await getFetch('fo', url);
|
|
|
|
// msrDt 오름차순으로 정렬
|
|
const sortedData = res.data.sort((a: FlowRateModalInterface, b: FlowRateModalInterface) => {
|
|
return new Date(a.msrDt).getTime() - new Date(b.msrDt).getTime();
|
|
});
|
|
|
|
return { data: sortedData }
|
|
} catch (error) {
|
|
console.error('시설정보 유량현황 모달 데이터를 가져오는데 실패했습니다:', error);
|
|
return { data: [] }
|
|
}
|
|
}
|
|
|
|
|
|
/**====================================
|
|
* Store - expaort
|
|
====================================*/
|
|
|
|
export type FlowRateSearchActions = {
|
|
searchFlowRateList: (pageNo: number, pageSize: number, searchYear: string, part?: string, nameCd?: string, fcltCpct?: string, operationValue?: string, fcltyNm?: string) => void;
|
|
|
|
searchFlowRateModalList : (bscFctCd: string, searchYear: string) => void;
|
|
}
|
|
|
|
export type FlowRateSearchType = {
|
|
FlowRateSearch: {
|
|
isInit: boolean;
|
|
flowRateSearchLabelArray:string[];
|
|
},
|
|
|
|
FlowRateList : {
|
|
isInit : boolean;
|
|
upHeadList1: TableUpperProps[];
|
|
upHeadList2: TableUpperProps[];
|
|
upHeadList3: TableUpperProps[];
|
|
flowRateList:flowRateListProps[];
|
|
flowRateCount: number;
|
|
excelList: ExcelType[];
|
|
isLoading: boolean;
|
|
},
|
|
|
|
FlowRateModal : {
|
|
isInit : boolean;
|
|
modalFlowRateListYear : FlowRateModalProps[];
|
|
upHeadListFlowRateModalYear : TableUpperProps[];
|
|
}
|
|
}
|
|
|
|
export type FlowRateSearchStore = FlowRateSearchType & FlowRateSearchActions;
|
|
|
|
const dataFormSetting=(item : flowRateListProps | FlowRateModalProps)=> {
|
|
DataForm({ type: 'date', column: 'msrDt', item: item as unknown as Record<string, unknown> });
|
|
DataForm({ type: 'float0', column: 'totInflAmnt', 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: 'sumFlow', item: item as unknown as Record<string, unknown>});
|
|
DataForm({ type: 'float0', column: 'efflWqltBod', item: item as unknown as Record<string, unknown>});
|
|
DataForm({ type: 'float0', column: 'returnAmnt', item: item as unknown as Record<string, unknown>});
|
|
DataForm({ type: 'float0', column: 'efflAmnt', item: item as unknown as Record<string, unknown>});
|
|
}
|
|
|
|
export const flowRateSearchInitState:FlowRateSearchType = {
|
|
FlowRateSearch: {
|
|
isInit: false,
|
|
flowRateSearchLabelArray: FlowRateSearchLabelArray,
|
|
},
|
|
FlowRateList : {
|
|
isInit : false,
|
|
upHeadList1 : upHeadList1,
|
|
upHeadList2 : upHeadList2,
|
|
upHeadList3 : upHeadList3,
|
|
flowRateList : flowRateList,
|
|
flowRateCount : 0,
|
|
excelList: [],
|
|
isLoading: true,
|
|
},
|
|
FlowRateModal : {
|
|
isInit : false,
|
|
upHeadListFlowRateModalYear : upHeadListFlowRateModal,
|
|
modalFlowRateListYear : modalFlowRateListYear,
|
|
}
|
|
}
|
|
|
|
export const flowRateSearchReducer:(set:(fn: (state: FlowRateSearchType) => FlowRateSearchType) => void)=>FlowRateSearchActions=(set: (fn: (state: FlowRateSearchType) => FlowRateSearchType) => void) => {
|
|
return {
|
|
searchFlowRateList: async (pageNo: number, pageSize: number, searchYear: string, partCd?: string, nameCd?: string, fcltCpct?: string, operationValue?: string, fcltyNm?: string) => {
|
|
set((state: FlowRateSearchType) => ({
|
|
...state,
|
|
FlowRateList: {
|
|
...state.FlowRateList,
|
|
isLoading: true,
|
|
},
|
|
}));
|
|
const res = await fetchFlowRateList(pageNo, pageSize, searchYear, partCd, nameCd, fcltCpct, operationValue, fcltyNm);
|
|
const data = res.data;
|
|
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)
|
|
dataFormSetting(item);
|
|
return item;
|
|
});
|
|
|
|
if(pageSize>5000){
|
|
rtnData.forEach((item: flowRateListProps) => {
|
|
excelDownList.push({
|
|
시설코드: item.bscFctCd,
|
|
권역: item.rvbsn,
|
|
단위유역: item.lgbsn,
|
|
중권역: item.mdmbsn,
|
|
환경청: item.rgnNm,
|
|
시도: item.sido,
|
|
시군구: item.gugun,
|
|
시설이름: item.bscFctNm,
|
|
주소: item.daddr,
|
|
"시설용량(m³/일)": item.fctCpc,
|
|
"총유입량(m³/일)": item.totInflAmnt,
|
|
"하수유입량(m³/일)": item.inflAmnt,
|
|
"연계처리량(m³/일)": item.sumFlow,
|
|
"총인반류수량(m³/일)": item.returnAmnt,
|
|
"방류량(m³/일)": item.efflAmnt,
|
|
});
|
|
});
|
|
}
|
|
|
|
set((state: FlowRateSearchType) => ({
|
|
...state,
|
|
FlowRateList: pageSize<5000?{
|
|
...state.FlowRateList,
|
|
flowRateList: rtnData,
|
|
flowRateCount: res.count,
|
|
isLoading : false,
|
|
}:{
|
|
...state.FlowRateList,
|
|
excelList: excelDownList,
|
|
isLoading : false,
|
|
},
|
|
}))
|
|
},
|
|
searchFlowRateModalList: async (bscFctCd: string, searchYear: string) => {
|
|
const res = await fetchFlowRateModalList(bscFctCd, searchYear);
|
|
const inflData = CalcRainEffect(res.data);
|
|
|
|
const res2 = await fetchFacilityWaterQltyListHist(searchYear, bscFctCd);
|
|
const wqltData = CalcRainEffect(res2?.data.wqltObjs);
|
|
|
|
/**
|
|
* [(강우시 일별유입유량*강우시 일별유입BOD)-(청천시 연평균유입유량*청천시 연평균유입BOD)]
|
|
/강우시 일별유입BOD)
|
|
*/
|
|
//let rainInflAmnt = 0;
|
|
let sunnyInflAmnt = 0;
|
|
let sunnyBod = 0;
|
|
//let rainDay = 0;
|
|
let sunnyDay = 0;
|
|
|
|
inflData.forEach(item => {
|
|
if(item.rainEffectDay == 1){
|
|
//rainDay += 1;
|
|
//rainInflAmnt += Number(item.inflAmnt);
|
|
} else {
|
|
const msrDt = item.msrDt.replaceAll('-','');
|
|
sunnyDay += 1;
|
|
sunnyInflAmnt += Number(item.inflAmnt);
|
|
sunnyBod += Number(wqltData.filter((wqitem)=>wqitem.msrDt === msrDt)[0].inflAssctBfrWqltBod);
|
|
}
|
|
});
|
|
|
|
//const yearRainAmnt = rainInflAmnt===0?0:rainInflAmnt / rainDay;
|
|
const yearSunnyAmnt = sunnyInflAmnt===0?0:sunnyInflAmnt / sunnyDay;
|
|
const yearSunnyBod = sunnyBod===0?0:sunnyBod / sunnyDay;
|
|
|
|
const rtnData = inflData.map((item: FlowRateModalProps) => {
|
|
const dayBod = Number(wqltData.filter(wqitem=>wqitem.msrDt === item.msrDt.replaceAll('-',''))[0].inflAssctBfrWqltBod);
|
|
const noProcessInflAmnt = roundNumber(((Number(item.inflAmnt) * dayBod) - (yearSunnyAmnt * yearSunnyBod)) / dayBod, 0)
|
|
|
|
item.totInflAmnt = Number(item.inflAmnt || 0) + Number(item.sumFlow || 0) + Number(item.returnAmnt || 0);
|
|
item.noProcessInflAmnt = noProcessInflAmnt && Number(noProcessInflAmnt.replaceAll(',','')) > 0 ? noProcessInflAmnt : '';
|
|
dataFormSetting(item);
|
|
return item;
|
|
});
|
|
|
|
set((state: FlowRateSearchType) => ({
|
|
...state,
|
|
FlowRateModal: {
|
|
...state.FlowRateModal,
|
|
modalFlowRateListYear: rtnData || [],
|
|
}
|
|
}))
|
|
}
|
|
}
|
|
} |