diff --git a/apps/sn/app/(with-base-layout)/ii/irsetting/page.tsx b/apps/sn/app/(with-base-layout)/ii/irsetting/page.tsx index 14a565851..de187da5d 100644 --- a/apps/sn/app/(with-base-layout)/ii/irsetting/page.tsx +++ b/apps/sn/app/(with-base-layout)/ii/irsetting/page.tsx @@ -9,7 +9,7 @@ import { zodResolver } from '@hookform/resolvers/zod' import { useState } from 'react' import { useForm } from 'react-hook-form' import { z } from 'zod' -import { excelToFlowRateData, excelToMatchingResultData, excelToTimePatternData } from '@/components/lib/utils' +import { excelToFlowRateData, excelToMatchingResultData, excelToTimePatternData, excelToRcptrInfoData } from '@/components/lib/utils' import BaseLayout from '../BaseLayout' import { validateMultipleFiles, FILE_EXTENSIONS, type FileValidationConfig } from '../../fileValidation'; import { validateBasicSelectionsWithAlert } from '../../selectionValidation'; @@ -172,12 +172,14 @@ const IrSetting = () => { const file1 = uploadedFilesData[0]; // 오수관망도 const file2 = uploadedFilesData[1]; // 수용가-맨홀 매칭결과 const file3 = uploadedFilesData[2]; // 오수량 시간패턴 - const file4 = uploadedFilesData[3]; // 유량자료 + const file4 = uploadedFilesData[3]; // 유량자료 + const file5 = uploadedFilesData[4]; // 수용가 상수사용량 console.log("오수관망도 정보:", file1?.file); console.log("수용가-맨홀 매칭결과 정보:", file2); console.log("오수량 시간패턴 정보:", file3); console.log("유량자료 정보:", file4); + console.log("수용가 상수사용량 정보:", file5); // 모든 필수 파일이 선택되었는지 확인 (UploadedFileInfo 객체와 그 안의 file 객체 모두 확인) // 유량자료는 선택값 @@ -214,6 +216,14 @@ const IrSetting = () => { fileDescription: '유량자료' }); } + // 수용가 상수사용량 파일이 있는 경우 검증 목록에 추가 + if (file5?.file) { + validationConfigs.push({ + file: file5.file, + allowedExtensions: FILE_EXTENSIONS.EXCEL, + fileDescription: '수용가 상수사용량' + }); + } // 파일 확장자 검증 실행 const validationResult = validateMultipleFiles(validationConfigs); @@ -242,18 +252,22 @@ const IrSetting = () => { type MatchingResult = { anlsSn: number; mhlMngNo: string; rcptrNo: string; }; type TimePattern = { hrId: number; rt?: number | null | undefined; }; type FlowRate = { pplMngNo: string; mtrngDt: string; oilq?: number | null | undefined; }; + type rcptrInfo = { rcptrNo: string; useYm: string; usqty?: number | null | undefined; }; const filePickers: { file: UploadedFileInfo; - parser: (excelData: any) => MatchingResult[] | TimePattern[] | FlowRate[]; + parser: (excelData: any) => MatchingResult[] | TimePattern[] | FlowRate[] | rcptrInfo[]; }[] = [ { file: file2, parser: excelToMatchingResultData }, { file: file3, parser: excelToTimePatternData } ]; - if (file4?.file) { + if (file4?.file) { // 유량자료 파일이 있는 경우 filePickers.push({ file: file4, parser: excelToFlowRateData }); } + if (file5?.file) { // 수용가 상수사용량 파일이 있는 경우 + filePickers.push({ file: file5, parser: excelToRcptrInfoData }); + } try { const parsedResults = await Promise.all( @@ -290,6 +304,9 @@ const IrSetting = () => { const flowRateData = file4?.file ? parsedResults.find(r => r && r.fileName === file4.file?.name)?.parsedData : null; + const rcptrInfoData = file5?.file + ? parsedResults.find(r => r && r.fileName === file5.file?.name)?.parsedData + : null; // 새로운 JSON 데이터 생성 const combinedAnalysisData = { @@ -310,6 +327,7 @@ const IrSetting = () => { tbSnRcptrMhlMpng: matchingResultData, // 수용가-맨홀 매칭결과 tbSnHrPttn: timePatternData, // 오수량 시간패턴 tbSnOilqData: flowRateData, // 유량자료 (없을 수 있음) + tbSnRcptrInfo: rcptrInfoData, // 수용가 상수사용량 (없을 수 있음) }; console.log("통합 분석 데이터 (JSON):", combinedAnalysisData); @@ -326,7 +344,7 @@ const IrSetting = () => { } // const handleAnalysisClick = () => { // } - + const rcptrInfoShow = false; return ( <> @@ -390,6 +408,15 @@ const IrSetting = () => { startYear={1900} // 시작 연도 설정 /> + {rcptrInfoShow && + handleFileSelection(4, file, cd, id)} + showButton={false} + showPreview={true} + accept={".xls, .xlsx, .xlsm, .xltx"} + fileIdx={4} /> + } { return flowRateData; }; +// 수용가 물사용량 +export const rcptrInfoZod = z.object({ + rcptrNo: z.string(), // 수용가번호 + useYm: z.string(), // 사용연월 + usqty: z.number().nullish(), // 사용량(㎥) +}); +export type rcptrInfoZodType = z.infer; +export const excelToRcptrInfoData = (excelData: any) => { + const flowRateData: rcptrInfoZodType[] = excelData.map((item: any) => { + + return { + rcptrNo: String(item["수용가번호"]), + useYm: String(item["사용연월"]), + usqty: Number(item["사용량(㎥)"]), + }; + }).filter((el: any) => el !== undefined); + return flowRateData; +}; + // 강우자료 (수정 필요) export const rainZod = z.object({