368 lines
15 KiB
TypeScript
368 lines
15 KiB
TypeScript
import { getFetch } from "@/app/components/api";
|
|
import type { TableUpperProps } from "../dashboard";
|
|
import DataForm from "@/app/components/common/DataForm";
|
|
|
|
/**====================================
|
|
* 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,
|
|
용량: number,
|
|
총유입량: number | '',
|
|
하수유입량: number | '',
|
|
연계처리량: number | '',
|
|
총인반류수량: number | '',
|
|
방류량: number | '',
|
|
환경청:string|'',
|
|
}
|
|
|
|
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 | '' ,
|
|
}
|
|
export type FlowRateModalProps = {
|
|
msrDt : string,
|
|
totInflAmnt : number,
|
|
inflAmnt : number,
|
|
sumFlow : number,
|
|
returnAmnt : number,
|
|
efflAmnt : number,
|
|
infoRnDay : number | string | '',
|
|
rainEffectDay : number | string | '',
|
|
}
|
|
|
|
/**====================================
|
|
* Store - data
|
|
====================================*/
|
|
|
|
/**
|
|
* (1) 메인페이지
|
|
*/
|
|
// 리스트 (행정별)
|
|
const upHeadList1:TableUpperProps[] = [
|
|
{ id: "bscFctCd", title: "시설코드", row:0, rowSpan:2},
|
|
{ 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: "bscFctCd", title: "시설코드", row:0, rowSpan:2},
|
|
{ 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: "bscFctCd", title: "시설코드", row:0, rowSpan:2 },
|
|
{ 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: "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);
|
|
console.log(url);
|
|
return { data: res.data, count: res.count }
|
|
} catch (error) {
|
|
console.error('시설정보 유량현황 데이터를 가져오는데 실패했습니다:', error);
|
|
return { data: [], count: 0 };
|
|
}
|
|
}
|
|
|
|
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[];
|
|
},
|
|
|
|
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: 'float1', column: 'totInflAmnt', item: item as unknown as Record<string, unknown>});
|
|
DataForm({ type: 'float1', column: 'inflAmnt', item: item as unknown as Record<string, unknown>});
|
|
DataForm({ type: 'float1', column: 'sumFlow', item: item as unknown as Record<string, unknown>});
|
|
DataForm({ type: 'float1', column: 'efflWqltBod', item: item as unknown as Record<string, unknown>});
|
|
DataForm({ type: 'float1', column: 'returnAmnt', item: item as unknown as Record<string, unknown>});
|
|
DataForm({ type: 'float1', 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: []
|
|
},
|
|
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) => {
|
|
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,
|
|
용량: item.fctCpc,
|
|
총유입량: item.totInflAmnt,
|
|
하수유입량: item.inflAmnt,
|
|
연계처리량: item.sumFlow,
|
|
총인반류수량: item.returnAmnt,
|
|
방류량: item.efflAmnt,
|
|
});
|
|
});
|
|
}
|
|
|
|
set((state: FlowRateSearchType) => ({
|
|
...state,
|
|
FlowRateList: pageSize<5000?{
|
|
...state.FlowRateList,
|
|
flowRateList: rtnData,
|
|
flowRateCount: res.count,
|
|
}:{
|
|
...state.FlowRateList,
|
|
excelList: excelDownList,
|
|
}
|
|
}))
|
|
},
|
|
searchFlowRateModalList: async (bscFctCd: string, searchYear: string) => {
|
|
const res = await fetchFlowRateModalList(bscFctCd, searchYear);
|
|
const data = res.data;
|
|
const tmpData:FlowRateModalProps[] = [];
|
|
|
|
data.forEach((item: FlowRateModalProps) => {
|
|
if(item.infoRnDay && item.infoRnDay.toString().trim() === 'x') {
|
|
item.infoRnDay = '';
|
|
}
|
|
});
|
|
|
|
// facilityPrecipitation의 rainEffectDay 계산 로직을 적용
|
|
for(let idx = 0; idx < data.length; idx++) {
|
|
const item = data[idx];
|
|
const rainDay = Number(item.infoRnDay) >= 3 ? 1 : 0;
|
|
let rainEffectDay = 0;
|
|
|
|
if(idx < data.length - 2) {
|
|
if(rainDay == 1) {
|
|
rainEffectDay = 1;
|
|
} else {
|
|
if(idx >= 2) {
|
|
if(Number(data[idx-1].infoRnDay) >= 3 || Number(data[idx-2].infoRnDay) >= 3) {
|
|
rainEffectDay = 1;
|
|
}
|
|
}
|
|
}
|
|
} else if(idx < data.length - 1) {
|
|
if(rainDay == 1 || Number(data[idx+1].infoRnDay) >= 3) {
|
|
rainEffectDay = 1;
|
|
}
|
|
} else {
|
|
rainEffectDay = rainDay;
|
|
}
|
|
|
|
tmpData.push({
|
|
...item,
|
|
rainEffectDay: rainEffectDay,
|
|
});
|
|
}
|
|
|
|
const rtnData = tmpData.map((item: FlowRateModalProps) => {
|
|
item.totInflAmnt = Number(item.inflAmnt || 0) + Number(item.sumFlow || 0) + Number(item.returnAmnt || 0)
|
|
dataFormSetting(item);
|
|
return item;
|
|
});
|
|
|
|
set((state: FlowRateSearchType) => ({
|
|
...state,
|
|
FlowRateModal: {
|
|
...state.FlowRateModal,
|
|
modalFlowRateListYear: rtnData || [],
|
|
}
|
|
}))
|
|
}
|
|
}
|
|
} |