- excelToJson.ts 에 날짜 변환 함수 추가 및 타입 수정 - UITable 레이아웃을 이용한 입력 가능 Table인 EditableFormTable.tsx 컴포넌트 구현 - RDII 분석 페이지 수정 및 JSON 데이터 생성, API 호출 기능 구현
170 lines
6.0 KiB
TypeScript
170 lines
6.0 KiB
TypeScript
export const TEST_UUID= '2d4b151d-1828-41e0-91d9-4cd28ea1cc7e'
|
|
import { z } from "zod";
|
|
|
|
// "YYYY-MM-DDTHH:MM:SS" 형식으로 포맷팅 하는 함수
|
|
function parseAndFormatDateTimeToISOCompatibleString(
|
|
dateInput: string,
|
|
timeInputForMDY: string | null,
|
|
inputType: 'YYYY-MM-DD_H:MM' | 'M/D/YYYY_H:MM'
|
|
): string | null {
|
|
let year: number, month: number, day: number, hours: number, minutes: number;
|
|
let datePartStr: string;
|
|
let timePartStr: string;
|
|
|
|
if (inputType === 'YYYY-MM-DD_H:MM') {
|
|
const parts = String(dateInput).split(' ');
|
|
if (parts.length !== 2) {
|
|
console.warn(`Invalid dateTime format for ${inputType} (split space):`, dateInput);
|
|
return null;
|
|
}
|
|
datePartStr = parts[0] ?? ""; // "YYYY-MM-DD"
|
|
timePartStr = parts[1] ?? ""; // "H:MM"
|
|
|
|
const dateParts = datePartStr.split('-');
|
|
if (dateParts.length !== 3) {
|
|
console.warn(`Invalid date format for ${inputType} (datePart):`, datePartStr);
|
|
return null;
|
|
}
|
|
year = parseInt(dateParts[0] ?? '', 10);
|
|
month = parseInt(dateParts[1] ?? '', 10);
|
|
day = parseInt(dateParts[2] ?? '', 10);
|
|
} else if (inputType === 'M/D/YYYY_H:MM') {
|
|
datePartStr = String(dateInput); // "M/D/YYYY"
|
|
if (!timeInputForMDY) {
|
|
console.warn(`Time input is missing for ${inputType}:`, dateInput);
|
|
return null;
|
|
}
|
|
timePartStr = String(timeInputForMDY); // "H:MM"
|
|
|
|
const dateParts = datePartStr.split('/');
|
|
if (dateParts.length !== 3) {
|
|
console.warn(`Invalid date format for ${inputType} (datePart):`, datePartStr);
|
|
return null;
|
|
}
|
|
// Note: Order for M/D/YYYY is month, day, year
|
|
month = parseInt(dateParts[0] ?? '', 10);
|
|
day = parseInt(dateParts[1] ?? '', 10);
|
|
year = parseInt(dateParts[2] ?? '', 10);
|
|
} else {
|
|
console.warn("Invalid inputType for date parsing.");
|
|
return null;
|
|
}
|
|
|
|
// 시간 파싱 (H:MM) - 공통 로직
|
|
const timeParts = timePartStr.split(':');
|
|
if (timeParts.length !== 2) {
|
|
console.warn(`Invalid time format (timePart):`, timePartStr);
|
|
return null;
|
|
}
|
|
hours = parseInt(timeParts[0] ?? '', 10);
|
|
minutes = parseInt(timeParts[1] ?? '', 10);
|
|
|
|
if (isNaN(year) || isNaN(month) || isNaN(day) || isNaN(hours) || isNaN(minutes)) {
|
|
console.warn("Invalid parsed date or time numeric values:", { year, month, day, hours, minutes });
|
|
return null;
|
|
}
|
|
|
|
// "YYYY-MM-DDTHH:MM:SS" 형식으로 포맷팅 - 공통 로직
|
|
const formattedYear = String(year).padStart(4, '0'); // 연도는 4자리로 보장 (M/D/YYYY의 경우)
|
|
const formattedMonth = String(month).padStart(2, '0');
|
|
const formattedDay = String(day).padStart(2, '0');
|
|
const formattedHours = String(hours).padStart(2, '0');
|
|
const formattedMinutes = String(minutes).padStart(2, '0');
|
|
// 초는 00으로 고정, 'T'를 사용하여 Date 생성자 호환성 확보
|
|
return `${formattedYear}-${formattedMonth}-${formattedDay} ${formattedHours}:${formattedMinutes}:00`;
|
|
}
|
|
|
|
|
|
// 수용가-맨홀 매칭결과 (수정 필요)
|
|
export const MatchingResultZod = z.object({
|
|
anls_sn: z.number(), // 분석 일련번호
|
|
mhl_mng_no: z.string(), // 맨홀 번호 (임시값이라 추후 수정 필요)
|
|
rcptr_no: z.string(), // 수용가 번호
|
|
});
|
|
export type MatchingResultZodType = z.infer<typeof MatchingResultZod>;
|
|
export const excelToMatchingResultData = (excelData: any) => {
|
|
const MatchingResultData: MatchingResultZodType[] = excelData.map((item: any) => {
|
|
|
|
return {
|
|
anls_sn: Number(item["NO"]),
|
|
mhl_mng_no: String(item["FTR_IDN"]), // (임시값이라 추후 수정 필요)
|
|
rcptr_no: String(item["수용가"]),
|
|
};
|
|
}).filter((el: any) => el !== undefined);
|
|
return MatchingResultData;
|
|
};
|
|
|
|
|
|
// 시간패턴
|
|
export const timePatternZod = z.object({
|
|
hr_id: z.number(), // 시간
|
|
rt: z.number().nullish(), // 비율
|
|
});
|
|
export type timePatternZodType = z.infer<typeof timePatternZod>;
|
|
export const excelToTimePatternData = (excelData: any) => {
|
|
const timePatternData: timePatternZodType[] = excelData.map((item: any) => {
|
|
|
|
return {
|
|
hr_id: Number(item["시간"]),
|
|
rt: Number(item["비율"]),
|
|
};
|
|
}).filter((el: any) => el !== undefined);
|
|
return timePatternData;
|
|
};
|
|
|
|
|
|
// 유량자료
|
|
export const flowRateZod = z.object({
|
|
ppl_mng_no: z.string(), // 관로번호
|
|
mtrng_dt: z.string(), // 시간
|
|
oilq: z.number().nullish(), // 유량(㎥/h)
|
|
});
|
|
export type flowRateZodType = z.infer<typeof flowRateZod>;
|
|
export const excelToFlowRateData = (excelData: any) => {
|
|
const flowRateData: flowRateZodType[] = excelData.map((item: any) => {
|
|
const dateTimeStr = String(item["시간"]); // "YYYY-MM-DD H:MM" 형식 (예: "2025-02-23 8:50")
|
|
|
|
const formattedDateTime = parseAndFormatDateTimeToISOCompatibleString(dateTimeStr, null, 'YYYY-MM-DD_H:MM');
|
|
|
|
if (!formattedDateTime) return undefined;
|
|
|
|
const dateObject = new Date(formattedDateTime);
|
|
const mtrngDtValue = !isNaN(dateObject.getTime()) ? dateObject.toISOString() : null;
|
|
|
|
if (!mtrngDtValue) {
|
|
console.warn("Failed to create Date object for flowRateData:", formattedDateTime);
|
|
return undefined;
|
|
}
|
|
|
|
return {
|
|
ppl_mng_no: String(item["관로번호"]),
|
|
mtrng_dt: mtrngDtValue,
|
|
oilq: Number(item["유량(㎥/h)"]),
|
|
};
|
|
}).filter((el: any) => el !== undefined);
|
|
return flowRateData;
|
|
};
|
|
|
|
|
|
// 강우자료 (수정 필요)
|
|
export const rainZod = z.object({
|
|
mtrng_dt: z.string(), // 날짜 + 시간
|
|
amrf: z.number().nullish(), // 강우량(mm)
|
|
});
|
|
export type rainZodType = z.infer<typeof rainZod>;
|
|
export const excelToRainData = (excelData: any) => {
|
|
const rainData: rainZodType[] = excelData.map((item: any) => {
|
|
const datePartStr = String(item["날짜"]); // "M/D/YYYY" 형식 (예: "5/9/2021")
|
|
const timePartStr = String(item["시간"]); // "H:MM" 형식 (예: "8:00")
|
|
|
|
const formattedForRainZod = parseAndFormatDateTimeToISOCompatibleString(datePartStr, timePartStr, 'M/D/YYYY_H:MM');
|
|
|
|
if (!formattedForRainZod) return undefined;
|
|
|
|
return {
|
|
mtrng_dt: formattedForRainZod,
|
|
amrf: Number(item["강우량(mm)"]),
|
|
};
|
|
}).filter((el: any) => el !== undefined);
|
|
return rainData;
|
|
}; |