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); 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[]; 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 }); DataForm({ type: 'float1', column: 'totInflAmnt', item: item as unknown as Record}); DataForm({ type: 'float1', column: 'inflAmnt', item: item as unknown as Record}); DataForm({ type: 'float1', column: 'sumFlow', item: item as unknown as Record}); DataForm({ type: 'float1', column: 'efflWqltBod', item: item as unknown as Record}); DataForm({ type: 'float1', column: 'returnAmnt', item: item as unknown as Record}); DataForm({ type: 'float1', column: 'efflAmnt', item: item as unknown as Record}); } 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, 용량: 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, isLoading : false, }:{ ...state.FlowRateList, excelList: excelDownList, isLoading : false, }, })) }, searchFlowRateModalList: async (bscFctCd: string, searchYear: string) => { const res = await fetchFlowRateModalList(bscFctCd, searchYear); const data = res.data; // 강우영향일 계산 (강우량이 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-1]?.infoRnDay.toString().trim()) >= 3) { data[idx]!.infoRnDay = data[idx-1]!.infoRnDay; } } if(idx > 2){ if(data[idx-2]?.infoRnDay && Number(data[idx-2]?.infoRnDay.toString().trim()) >= 3) { data[idx]!.infoRnDay = data[idx-2]!.infoRnDay; } } } } const rtnData = data.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 || [], } })) } } }