diff --git a/apps/fo/app/components/common/DataForm.tsx b/apps/fo/app/components/common/DataForm.tsx index c478826f0..4c6f2840f 100644 --- a/apps/fo/app/components/common/DataForm.tsx +++ b/apps/fo/app/components/common/DataForm.tsx @@ -39,10 +39,7 @@ export default function DataForm({ type, column, item }: DataFormProps) { break; case 'float0': if(value) { - item[column] = String(value).includes('.')?String(Math.round(parseFloat(value.toString().replace(/,/g, '')) * 1) / 1).split('.').map((part, index) => - index === 0 ? part.replace(/\B(?=(\d{3})+(?!\d))/g, ",") : part - ).join('.') - : String(value).replace(/\B(?=(\d{3})+(?!\d))/g, ","); + item[column] = roundNumber(value, 0); } break; case 'float1': diff --git a/apps/fo/app/pages/(with-layout)/dashboard/maingraph/page.tsx b/apps/fo/app/pages/(with-layout)/dashboard/maingraph/page.tsx index 22143b842..3f193e035 100644 --- a/apps/fo/app/pages/(with-layout)/dashboard/maingraph/page.tsx +++ b/apps/fo/app/pages/(with-layout)/dashboard/maingraph/page.tsx @@ -22,10 +22,12 @@ export default function DashBoardChart({searchYear = '', fcltyList = []}: facili const [chart_tpTp, setChart_tpTp] = useState<{ chartData1: lineChartDataProps[]; chartData2: lineChartDataProps[]; + chartData3: lineChartDataProps[]; }>(); const [chart_tntn, setChart_tntn] = useState<{ chartData1: lineChartDataProps[]; chartData2: lineChartDataProps[]; + chartData3: lineChartDataProps[]; }>(); const [chart_inflBodInflTn, setChart_inflBodInflTn] = useState<{ chartData1: lineChartDataProps[]; @@ -46,6 +48,7 @@ export default function DashBoardChart({searchYear = '', fcltyList = []}: facili chart_efflTn, chart_inflBod, isLoadingMainGraph, + waterQltyStandartd, } = MainGraph; /** @@ -90,6 +93,10 @@ export default function DashBoardChart({searchYear = '', fcltyList = []}: facili label: '방류T-P', color: colors[1], }, + chartData3: { + label : '법적방류T-P', + color : 'blackdash', + } } satisfies ChartConfig; // 유입T-N-방류T-N @@ -102,6 +109,10 @@ export default function DashBoardChart({searchYear = '', fcltyList = []}: facili label: '방류T-N', color: colors[1], }, + chartData3: { + label : '법적방류T-N', + color : 'blackdash', + } } satisfies ChartConfig; // 유입BOD-유입T-N @@ -139,21 +150,37 @@ export default function DashBoardChart({searchYear = '', fcltyList = []}: facili useEffect(() => { if (!chart_chongInTp || !chart_efflTp) return; + const legalTpData: lineChartDataProps[] = []; + if (waterQltyStandartd){ + chart_inflTn.forEach(item =>{ + legalTpData.push({label : item.label, val:waterQltyStandartd.tp}); + }) + } + const chartTpTpData = { chartData1: chart_chongInTp, - chartData2: chart_efflTp + chartData2: chart_efflTp, + chartData3: legalTpData }; setChart_tpTp(chartTpTpData); - }, [chart_chongInTp, chart_efflTp]); + }, [chart_chongInTp, chart_efflTp, chart_inflTn, waterQltyStandartd]); useEffect(() => { if (!chart_inflTn || !chart_efflTn) return; + const legalTnData: lineChartDataProps[] = []; + if (waterQltyStandartd){ + chart_inflTn.forEach(item =>{ + legalTnData.push({label : item.label, val:waterQltyStandartd.tn}); + }) + } + const chartTntnData = { chartData1: chart_inflTn, - chartData2: chart_efflTn + chartData2: chart_efflTn, + chartData3: legalTnData, }; setChart_tntn(chartTntnData); - }, [chart_inflTn, chart_efflTn]); + }, [chart_inflTn, chart_efflTn, waterQltyStandartd]); useEffect(() => { if (!chart_inflBod || !chart_inflTn) return; diff --git a/apps/fo/app/pages/(with-layout)/dashboard/page.tsx b/apps/fo/app/pages/(with-layout)/dashboard/page.tsx index df41340e4..31b7da073 100644 --- a/apps/fo/app/pages/(with-layout)/dashboard/page.tsx +++ b/apps/fo/app/pages/(with-layout)/dashboard/page.tsx @@ -18,6 +18,22 @@ const tabList = [ //{ value: 'drainageEquipment', label: '배수설비 정비현황' } ]; +export const generateYearDates = (searchYear: string) => { + const dates: string[] = []; + const start = new Date(Number(searchYear), 0, 1); // 1월 1일 + const end = new Date(Number(searchYear), 11, 31); // 12월 31일 + + for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) { + const year = d.getFullYear(); + const month = String(d.getMonth() + 1).padStart(2, "0"); + const day = String(d.getDate()).padStart(2, "0"); + + dates.push(`${year}-${month}-${day}`); // YYYY-MM-DD 형식 + } + + return dates; +} + export default function DashBoard() { // 입력값 상태 관리 const { Common, initializeCommonData,searchMainGraph, searchRainManage, searchOperationStatus, OperationStatus, RainManage, MainGraph, PlanFclty } = useFoStore((state) => state); @@ -191,9 +207,46 @@ export default function DashBoard() { case 'mainGraph': searchMainGraph(searchYear, fcltyList.bscFctCd); + const yearData = generateYearDates(searchYear); + const yearValueData : any = []; + + for (const i in yearData){ + const rowArray: string[] = []; + rowArray.push(yearData[i] ?? ""); + //강수량 + rowArray.push(roundNumber(chart_inflowRain.filter(item=>{return yearData[i] === item.label})[0]?.barVal0?.toString(), 1) || ''); + //유입하수량 + rowArray.push(roundNumber(chart_inflowRain.filter(item=>{return yearData[i] === item.label})[0]?.lineVal1?.toString(), 0) || ''); + //시설용량 + rowArray.push(roundNumber(chart_inflowRain.filter(item=>{return yearData[i] === item.label})[0]?.lineVal0?.toString(), 0) || ''); + //유입BOD + rowArray.push(roundNumber(chart_bodRain.filter(item=>{return yearData[i] === item.label})[0]?.lineVal0?.toString(), 1) || ''); + //유입T-P + rowArray.push(roundNumber(chart_inflTp.filter(item=>{return yearData[i] === item.label})[0]?.val?.toString(), 3) || ''); + //총인유입T-P + rowArray.push(roundNumber(chart_chongInTp.filter(item=>{return yearData[i] === item.label})[0]?.val?.toString(), 3) || ''); + //방류T-P + rowArray.push(roundNumber(chart_efflTp.filter(item=>{return yearData[i] === item.label})[0]?.val?.toString(), 3) || ''); + //유입T-N + rowArray.push(roundNumber(chart_inflTn.filter(item=>{return yearData[i] === item.label})[0]?.val?.toString(), 3) || ''); + //방류T-N + rowArray.push(roundNumber(chart_efflTn.filter(item=>{return yearData[i] === item.label})[0]?.val?.toString(), 3) || ''); + + yearValueData.push( + rowArray + ) + } + console.log(yearValueData); + /* const excelData = [['날짜', '강수량', '유입하수량','시설용량', '유입BOD', '유입T-P', '총인유입T-P', '방류T-P'], */ const sheetParameter = [ { + data: [['날짜', '강수량', '유입하수량', '시설용량', '유입BOD', '유입T-P','총인유입T-P', '방류T-P', '유입T-N', '방류T-N'],...yearValueData], + headerNum: 1, + headerRange: 'A1:J1', + sheetName: '주요그래프' + } + /* { data: [['날짜', '강수량'],...chart_inflowRain.map((item) => [item.label, roundNumber(item.barVal0, 1)])], headerNum: 1, headerRange: 'A1:B1', @@ -246,7 +299,7 @@ export default function DashBoard() { headerNum: 1, headerRange: 'A1:B1', sheetName: '방류T-N' - } + } */ ]; downloadMultipleExcel('주요그래프', sheetParameter); diff --git a/apps/fo/app/store/dashboard/index.tsx b/apps/fo/app/store/dashboard/index.tsx index 11a215a1d..958346b74 100644 --- a/apps/fo/app/store/dashboard/index.tsx +++ b/apps/fo/app/store/dashboard/index.tsx @@ -6,8 +6,9 @@ import { getFetch } from "@/app/components/api"; import CalcRainEffect from "@/app/components/common/CalcRainEffect"; import DataForm from "@/app/components/common/DataForm"; import { fetchPlanInfo, OSU_PERCENT, qltyDataSetting, roundUp } from "../common"; -import type { FacilityWaterQltyProps } from "../facilityWaterQlty"; +import { type FacilityWaterQltyProps } from "../facilityWaterQlty"; import { fetchFlowRateModalList } from "../flowRate"; +import { fetchFacilityWaterQltyInfo } from "../processFacility"; // selectBox export type SelectDataType = { @@ -100,7 +101,7 @@ export type lineBarChartDataProps = { export type lineChartDataProps = { label : string, - val : number + val : number, } export interface RainManageListProps { @@ -662,6 +663,7 @@ const chart_inflTn : lineChartDataProps[] = []; const chart_efflTn : lineChartDataProps[] = []; const chart_inflBod : lineChartDataProps[] = []; const chart_efflBod : lineChartDataProps[] = []; +const waterQltyStandartd : any = []; const rainManageList : RainManageListProps[] = []; @@ -1034,6 +1036,7 @@ export type DashBoardType = { chart_efflTn : lineChartDataProps[]; chart_inflBod : lineChartDataProps[]; chart_efflBod : lineChartDataProps[]; + waterQltyStandartd : any; isLoadingMainGraph : boolean; }, @@ -1096,6 +1099,7 @@ export const dashBoardInitState:DashBoardType = { chart_efflTn : chart_efflTn, chart_inflBod : chart_inflBod, chart_efflBod : chart_efflBod, + waterQltyStandartd : waterQltyStandartd, isLoadingMainGraph : false, }, @@ -1817,6 +1821,24 @@ export const dashBoardReducer:(set:(fn: (state: DashBoardType) => DashBoardType) }, })); const res = await fetchMainGraph(searchYear, fcltyCd); + const res2 = await fetchFacilityWaterQltyInfo(fcltyCd); + + // 법적방류수질 데이터 + const sortedWaterQltyInfo = [...res2].sort((a, b) => { + // 숫자로 변환하여 비교 + const numA = Number(a.extnsSeqno); + const numB = Number(b.extnsSeqno); + if (!isNaN(numA) && !isNaN(numB)) { + return numA - numB; + } + // 숫자 변환이 실패하면 문자열로 비교 + return String(a.extnsSeqno).localeCompare(String(b.extnsSeqno)); + }); + + const waterQltyStandartd : any = sortedWaterQltyInfo && sortedWaterQltyInfo.length > 0 + ? sortedWaterQltyInfo[sortedWaterQltyInfo.length - 1] + : []; + if(res == null || res.data == null || res.data.length === 0) { set((state: DashBoardType) => ({ ...state, @@ -1831,6 +1853,7 @@ export const dashBoardReducer:(set:(fn: (state: DashBoardType) => DashBoardType) chart_efflTn: [], chart_inflBod: [], chart_efflBod: [], + waterQltyStandartd : [], isLoadingMainGraph : false, } })); @@ -1898,6 +1921,7 @@ export const dashBoardReducer:(set:(fn: (state: DashBoardType) => DashBoardType) chart_efflTn: chart_efflTn, chart_inflBod: chart_inflBod, chart_efflBod: chart_efflBod, + waterQltyStandartd : waterQltyStandartd, isLoadingMainGraph : false, }, })) diff --git a/apps/fo/app/store/processFacility/index.tsx b/apps/fo/app/store/processFacility/index.tsx index bb9fdb086..da6589001 100644 --- a/apps/fo/app/store/processFacility/index.tsx +++ b/apps/fo/app/store/processFacility/index.tsx @@ -456,7 +456,7 @@ const fetchFacilityHistInfo = async (facilityCd:string ): Promise => { +export const fetchFacilityWaterQltyInfo = async (facilityCd:string ): Promise => { try { const res = await getFetch('fo', '/prcsFclt/info/history/'+facilityCd); const data = res.data;