From ed38451f84b9315f0c47486c68771d2f035dc554 Mon Sep 17 00:00:00 2001 From: leedj312 Date: Wed, 2 Jul 2025 20:19:02 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B2=B0=ED=95=A8=EB=8C=80=EC=9E=A5=20=20?= =?UTF-8?q?=EC=9E=91=EC=97=85=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruseFcltMng/prfmncReg/chkgdnReg/page.tsx | 6 +- .../prfmncReg/chkgdnReg/rainChkgdn/excel.tsx | 20 +-- .../prfmncReg/chkgdnReg/rainChkgdn/index.tsx | 168 ++++++++++-------- .../chkgdnSttn/rainChkgdnSttn/headList.tsx | 2 +- .../chkgdnSttn/rainChkgdnSttn/index.tsx | 3 +- apps/wr/components/lib/func/TableData.tsx | 3 +- .../ui/modal/chkgd/chkgdExcel/chkgdExcel.tsx | 71 ++++---- .../ui/modal/chkgd/chkgdModal/chkgdModal.tsx | 23 ++- .../chkgdTable/rainChkgd/rainChkgdTable.tsx | 7 +- apps/wr/public/sample_rainy.xlsx | Bin 11216 -> 11262 bytes 10 files changed, 166 insertions(+), 137 deletions(-) diff --git a/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx b/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx index 53a7a31f3..88a0de300 100644 --- a/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx @@ -20,7 +20,6 @@ import { SearchDiv, SearchFormLeft, SearchFormRight, - SearchInput, SelectBox, Title, UiModal, @@ -29,7 +28,6 @@ import ListDiv from "@common/business_components/ui/list_div"; import { Button, Label } from "@common/components/ui"; import { useCallback, useEffect, useState } from "react"; import { Toaster } from "react-hot-toast"; -import { shallow } from "zustand/shallow"; export default function Page() { const { @@ -135,8 +133,8 @@ export default function Page() { ); useEffect(() => { - rainChkgdn.isSttn = false; - rswtChkgdn.isSttn = false; + //rainChkgdn.isSttn = false; + //rswtChkgdn.isSttn = false; if (!rainChkgdn.isSttn && !rswtChkgdn.isSttn) { rainChkHeadChange({ rainChkgdn }, true); rswtChkHeadChange({ rswtChkgdn }, true); diff --git a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/excel.tsx b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/excel.tsx index 5754c02fc..58e8d6bf0 100644 --- a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/excel.tsx +++ b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/excel.tsx @@ -94,15 +94,15 @@ export const excelToRainChkData = (excelData: any, year: string) => { } const makeGuidDetail = Array.from({ length: 12 }, (_, i) => { let month = `${i + 1}`; - const splyData = item[`보급_${month}월`]; + const splyData = item[`대체_${month}월`]; const ruseData = item[`빗물_${month}월`]; if (month.length < 2) month = "0" + month; return { utztnUsgCd: item["이용용도"], ym: year + month, chckYmd: checkYmd, - splyUswtrUtztnQnt: Number(splyData ?? 0), - ruseFcltUtztnQnt: Number(ruseData ?? 0), + splyUswtrUtztnQnt: Number(splyData) || 0, + ruseFcltUtztnQnt: Number(ruseData) || 0, flg: "RNB", }; }); @@ -120,13 +120,13 @@ export const excelToRainChkData = (excelData: any, year: string) => { rainyDetails: [ { utztnUsgCd: item["이용용도"] ?? "", - ph: Number(item["PH"] ?? 0), - trbt: Number(item["탁도"] ?? 0), - grssClfg: Number(item["총대장균군수"] ?? 0), - etc: item["기타"] ?? "", // 필드 누락 방지 - vltnDt: vltnDt ?? "", - vltnMttr: item["위반사항"] ?? "", - levyAmt: Number(item["과태료부과금액(천원)"] ?? 0), + ph: Number(item["PH"] || 0), + trbt: Number(item["탁도"] || 0), + grssClfg: Number(item["총대장균군수"] || 0), + etc: item["기타"] || "", // 필드 누락 방지 + vltnDt: vltnDt || "-", + vltnMttr: item["위반사항"] || "-", + levyAmt: Number(item["과태료부과금액(천원)"] || 0), rgtr: TEST_UUID, }, ], diff --git a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx index 4af27a51c..4c7f2d514 100644 --- a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx +++ b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx @@ -1,7 +1,5 @@ import { buildingType } from "@/app/store/common/code"; -import { - TEST_UUID, -} from "@/app/store/ruseFcltMng/fcltReg/rainReg"; +import { TEST_UUID } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import { deleteFectch, fetchType, @@ -22,6 +20,7 @@ import { type chHeadType, } from "./headList"; import type { TableUpperProps } from "@/app/store/common/type/header"; +import toast from "react-hot-toast"; export type rainChkZodType = z.infer; const fcltDiv = [ @@ -52,7 +51,12 @@ export type rainChkgdnState = { }; type rainChkgdnActions = { - rainChkInit: (pageNo: string, cnt: string, sggCd: string, searchTxt: string) => void; + rainChkInit: ( + pageNo: string, + cnt: string, + sggCd: string, + searchTxt: string + ) => void; rainChkDetilUpdate(rainChk: rainChkZodType[]): Promise; rainChkGuidUpdate(rainChk: rainChkZodType): Promise; rainChkExcelDownload( @@ -98,11 +102,20 @@ const makeMdfrChk = (data: rainChkZodType[], type: string, toDo: string) => { return chData; }; -const initFetch = async (pageNo: string, cnt: string, txt: string | undefined, sgg: string | undefined) => { +const initFetch = async ( + pageNo: string, + cnt: string, + txt: string | undefined, + sgg: string | undefined +) => { const currentYear = new Date().getFullYear().toString(); const rainRes = await getFetch( "wr", - `/reuseChk/rainy` + (pageNo ? `/${pageNo}` : "/1") + (cnt ? `/${cnt}` : "/20") + (txt ? `/${txt}` : `/${currentYear}`) + (sgg ? `/${sgg}` : "/0") + `/reuseChk/rainy` + + (pageNo ? `/${pageNo}` : "/1") + + (cnt ? `/${cnt}` : "/20") + + (txt ? `/${txt}` : `/${currentYear}`) + + (sgg ? `/${sgg}` : "/0") ); return rainRes; }; @@ -131,32 +144,31 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = ( rainChkExcelDataUPload: async (excelData: rainChkZodType[]) => { try { const res = await postFectch("/reuseChk/rainy", excelData); - console.log("res", res); - console.log("res.ok", res.ok) - if (res.ok) { - ToastFormUi({ - body: "지도점검 등록이 완료되었습니다. ", - title: "지도점검 등록", - }); + if (res.status === 200) { + const currentYear = new Date().getFullYear().toString(); + const rainChkRes = await initFetch("1", "20", currentYear, "0"); + return set((state: rainChkgdnState) => ({ + ...state, + rainChkgdn: { + ...state.rainChkgdn, + rainChk: rainChkRes, + }, + })); + toast.success("지도점검 등록이 완료되었습니다."); + } else { + toast.error("지도점검 등록이 실패되었습니다."); } - const currentYear = new Date().getFullYear().toString(); - const rainChkRes = await initFetch("1", "20", currentYear, "0"); - return set((state: rainChkgdnState) => ({ - ...state, - rainChkgdn: { - ...state.rainChkgdn, - rainChk: rainChkRes, - }, - })); } catch (error) { console.log(error); - ToastFormUi({ - body: "지도점검 등록이 실패되었습니다.", - title: "지도점검 등록", - }); + toast.error("지도점검 등록이 실패되었습니다."); } }, - rainChkInit: async (pageNo: string, cnt: string, searchTxt: string, sggCd: string) => { + rainChkInit: async ( + pageNo: string, + cnt: string, + searchTxt: string, + sggCd: string + ) => { try { const rainChkRes = await initFetch(pageNo, cnt, searchTxt, sggCd); @@ -176,47 +188,49 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = ( const chData = await makeMdfrChk(rainChk, "rain", "rainDetil"); const res = await postFectch("/reuseChk/rainy", chData); - if (res.ok) { - ToastFormUi({ - body: "지도점검 보급수 및 밋물이용량 수정이 완료되었습니다. ", - title: "지도점검 수정", - }); + if (res.staus === 200) { + toast.success( + "지도점검 보급수 및 밋물이용량 수정이 완료되었습니다. " + ); + const currentYear = new Date().getFullYear().toString(); + const rainChkRes = await initFetch("1", "20", currentYear, "11"); + return set((state: rainChkgdnState) => ({ + ...state, + rainChkgdn: { + ...state.rainChkgdn, + rainChk: rainChkRes, + }, + })); + } else { + toast.error("지도점검 보급수 및 밋물이용량 수정 오류입니다."); } - const currentYear = new Date().getFullYear().toString(); - const rainChkRes = await initFetch(currentYear, "0"); - return set((state: rainChkgdnState) => ({ - ...state, - rainChkgdn: { - ...state.rainChkgdn, - rainChk: rainChkRes, - }, - })); } catch (error) { console.log(error); - alert("수정에 실패하였습니다."); + toast.error("지도점검 보급수 및 밋물이용량 수정 오류입니다."); } }, rainChkGuidUpdate: async (rainChk: rainChkZodType) => { try { //const chData = await makeMdfrChk(rainChk, "guideDetails", "rainDetil"); const res = await putFectch("/reuseChk/rainy", rainChk); - if (res.ok) { - ToastFormUi({ - body: "지도점검 수질 및 과태료 수정이 완료되었습니다. ", - title: "지도점검 수정", - }); + if (res.status === 200) { + toast.success("지도점검 수질 및 과태료 수정이 완료되었습니다. "); + + const currentYear = new Date().getFullYear().toString(); + const rainChkRes = await initFetch("1", "20", currentYear, "11"); + return set((state: rainChkgdnState) => ({ + ...state, + rainChkgdn: { + ...state.rainChkgdn, + rainChk: rainChkRes, + }, + })); + }else{ + toast.error("지도점검 수질 및 과태료 수정 오류입니다."); + } - const currentYear = new Date().getFullYear().toString(); - const rainChkRes = await initFetch(currentYear, "0"); - return set((state: rainChkgdnState) => ({ - ...state, - rainChkgdn: { - ...state.rainChkgdn, - rainChk: rainChkRes, - }, - })); } catch (error) { - console.log(error); + toast.error("지도점검 수질 및 과태료 수정 오류입니다."); } }, rainChkDelete: async (chkgdnPks: number[]) => { @@ -224,22 +238,23 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = ( const res = await deleteFectch(`/reuseChk/rainy`, chkgdnPks); if (res) { - ToastFormUi({ - body: "삭제가 완료되었습니다. ", - title: "지도점검 삭제", - }); + toast.success("삭제가 완료되었습니다. "); + + const currentYear = new Date().getFullYear().toString(); + const rainChkRes = await initFetch("1", "20", currentYear, "11"); + return set((state: rainChkgdnState) => ({ + ...state, + rainChkgdn: { + ...state.rainChkgdn, + rainChk: rainChkRes, + }, + })); + }else{ + toast.error("삭제시 오류가 발생하였습니다.. "); + } - const currentYear = new Date().getFullYear().toString(); - const rainChkRes = await initFetch(currentYear, "0"); - return set((state: rainChkgdnState) => ({ - ...state, - rainChkgdn: { - ...state.rainChkgdn, - rainChk: rainChkRes, - }, - })); } catch (error) { - ToastFormUi({ body: "삭제를 실패했습니다.. ", title: "지도점검 삭제" }); + toast.error("삭제시 오류가 발생하였습니다.. "); } }, rainChkHeadChange: async (rainChkgdn: rainChkgdnState, isEdit: boolean) => { @@ -249,16 +264,13 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = ( const ruseHeadList = rainChkgdn.rainChkgdn.ruseHeadList; rainChkgdnHeadList.forEach((head) => { - if (head.edit !== undefined) - head.edit = isEdit; + if (head.edit !== undefined) head.edit = isEdit; }); splHeadList.forEach((head) => { - if (head.edit !== undefined) - head.edit = isEdit; + if (head.edit !== undefined) head.edit = isEdit; }); ruseHeadList.forEach((head) => { - if (head.edit !== undefined) - head.edit = isEdit; + if (head.edit !== undefined) head.edit = isEdit; }); return set((state: rainChkgdnState) => ({ @@ -267,7 +279,7 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = ( ...state.rainChkgdn, rainChkgdnHeadList: rainChkgdnHeadList, splHeadList: splHeadList, - ruseHeadList: ruseHeadList + ruseHeadList: ruseHeadList, }, })); } catch (error) { diff --git a/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/headList.tsx b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/headList.tsx index f112db0bd..8c90e0829 100644 --- a/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/headList.tsx +++ b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/headList.tsx @@ -11,7 +11,7 @@ export const rainChkgdnHeadSttnExport: TableUpperProps[] = [ { id: "dtfcltCpct", title: "빗물저류조용량(m³)", mergeCell: true }, { id: "chckYmd", title: "점검일", mergeCell: true }, { id: "utztnUsgCd", title: "이용용도" }, - { id: "totalSplyUswtrUtztnQnt", title: "연간보급수이용량(m³)" }, + { id: "totalSplyUswtrUtztnQnt", title: "연간대체수이용량(m³)" }, { id: "totalRuseFcltUtztnQnt", title: "연간빗물이용량(m³)" }, { id: "ph", diff --git a/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/index.tsx b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/index.tsx index ea3f58a40..2136dfebe 100644 --- a/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/index.tsx +++ b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/index.tsx @@ -1,11 +1,10 @@ import type { rainChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; -import { type TableUpperProps } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import { getFetch } from "@/components/lib/api"; -import { ToastFormUi } from "@/components/ui/toast/toastFromUi"; import type { SelectDataType } from "@common/business_components/ui"; import { rainChkgdnHeadSttnExport, ruseSttnHeadListExport, splSttnHeadListExport } from "./headList"; import { rainHeadNmExport, type chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList"; import { buildingExcelRainSttn } from "./excel"; +import type { TableUpperProps } from "@/app/store/common/type/header"; const fcltDiv = [ { val: "RST", text: "중수도시설" }, diff --git a/apps/wr/components/lib/func/TableData.tsx b/apps/wr/components/lib/func/TableData.tsx index 9ac26827d..7a35e02c4 100644 --- a/apps/wr/components/lib/func/TableData.tsx +++ b/apps/wr/components/lib/func/TableData.tsx @@ -103,6 +103,7 @@ export const chRowspanTable = ( const key = head.id; const isMerged = head.mergeCell; const value = row[key]; + // 병합 대상이면 중복 렌더링 여부 판단 if (isMerged) { const renderedSet = renderedMap.get(key) ?? new Set(); @@ -152,7 +153,7 @@ export const chRowspanTable = ( onChange={(e) => { handleChange(rowIndex, head.id, e.target.value); }} - value={value ?? ""} + value={value || ""} disabled={!selectedIds.includes(row.chkgdnPk)} /> ) : ( diff --git a/apps/wr/components/ui/modal/chkgd/chkgdExcel/chkgdExcel.tsx b/apps/wr/components/ui/modal/chkgd/chkgdExcel/chkgdExcel.tsx index 15badc59d..8828420b8 100644 --- a/apps/wr/components/ui/modal/chkgd/chkgdExcel/chkgdExcel.tsx +++ b/apps/wr/components/ui/modal/chkgd/chkgdExcel/chkgdExcel.tsx @@ -1,7 +1,7 @@ import { useWrStore } from "@/app/store"; import { type rainChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; import { excelToRainChkData } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/excel"; -import { chkgdRegExcel } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList"; +import { chkgdRegExcel } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList"; import type { rswtChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rswrtChkgdn"; import { excelToRswtGuideData, @@ -18,24 +18,31 @@ import { SelectBox, Title, } from "@common/business_components/ui"; +import { Card } from "@common/business_components/ui/chart/lib/card"; import { Button, Input } from "@common/components/ui"; import { zodResolver } from "@hookform/resolvers/zod"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; +import toast from "react-hot-toast"; import type { z } from "zod"; export default function ChkgdExcel({ type }: { type: string }) { - const { - rswtChkgdn, - rainChkExcelDataUPload, - rswtChkExceDataUpload, - } = useWrStore((state) => { - return state; - }); - const [files, setFiles] = useState(null); + const { rswtChkgdn, rainChkExcelDataUPload, rswtChkExceDataUpload } = + useWrStore((state) => { + return state; + }); const [excelData, setExcelData] = useState< rswtChkZodType[] | rainChkZodType[] >(); + + const [file, setFile] = useState(null); + + const handleFileChange = (e: React.ChangeEvent) => { + const selectedFile = e.target.files?.[0]; + if (selectedFile) { + setFile(selectedFile); + } + }; const [excelRswtData, setExcelRswtData] = useState(); const currentYear = new Date().getFullYear(); @@ -49,7 +56,7 @@ export default function ChkgdExcel({ type }: { type: string }) { ); const defaultValues: z.infer = chkgdRegExcel.parse({ - chckYr: String(currentYear) + chckYr: String(currentYear), }); const form = useForm>({ @@ -58,14 +65,10 @@ export default function ChkgdExcel({ type }: { type: string }) { }); useEffect(() => { - if (files) { - const file = files[0]; + if (file) { if (form.getValues("chckYr").length < 1) { - ToastFormUi({ - body: "파일업로드 이전에 등록년도를 작성해주세요 ", - title: "지도점검 등록", - }); - setFiles(null); + toast.error("파일업로드 이전에 등록년도를 작성해주세요 "); + setFile(null); return; } if (file) @@ -87,7 +90,6 @@ export default function ChkgdExcel({ type }: { type: string }) { form.getValues("chckYr") ); - const keyGenerator = (item: rswtChkZodType) => `${item.bdstRuseFcltFk}|${item.chckYmd}|${item.utztnUsgCd}`; const totalData: rswtChkZodType[] = guideData.map((guide) => { @@ -98,12 +100,11 @@ export default function ChkgdExcel({ type }: { type: string }) { guide.utztnUsgCd === polution.utztnUsgCd ); - if (fusion) { return { ...guide, rswtrPollutions: fusion?.rswtrPollutions, - rswtrDetails:fusion?.rswtrDetails + rswtrDetails: fusion?.rswtrDetails, }; } else { return { @@ -118,19 +119,17 @@ export default function ChkgdExcel({ type }: { type: string }) { (item) => !guideKey.has(keyGenerator(item)) ); + const listTotalData: rswtChkZodType[] = [ + ...totalData, + ...onlypolution, + ]; - const listTotalData:rswtChkZodType[] =[ - ...totalData, - ...onlypolution - ] - - - setExcelRswtData(listTotalData); + setExcelRswtData(listTotalData); } }); } } - }, [files]); + }, [file]); function findMatchingItems( arrayA: T[], @@ -144,7 +143,6 @@ export default function ChkgdExcel({ type }: { type: string }) { (!condition || condition(item)) && bKeySet.has(keySelector(item)) ); } - const onSubmit = (values: z.infer) => { if (values.chckYr === "") { @@ -160,7 +158,6 @@ export default function ChkgdExcel({ type }: { type: string }) { }); return; } else { - rainChkExcelDataUPload(excelData as rainChkZodType[]); } } else if (type === "RST") { @@ -223,13 +220,13 @@ export default function ChkgdExcel({ type }: { type: string }) { name="file" render={({ field }) => ( - { - if (files) setFiles(files); - }} - fileTypes="xlsx" - > +
+ +
)} /> diff --git a/apps/wr/components/ui/modal/chkgd/chkgdModal/chkgdModal.tsx b/apps/wr/components/ui/modal/chkgd/chkgdModal/chkgdModal.tsx index 4e3d61008..965bc7275 100644 --- a/apps/wr/components/ui/modal/chkgd/chkgdModal/chkgdModal.tsx +++ b/apps/wr/components/ui/modal/chkgd/chkgdModal/chkgdModal.tsx @@ -39,7 +39,6 @@ export default function ChkgdModal({ type, obj }: { type: string; obj: any }) { "4": [] as z.infer[], }); - const { rainChk, ruseHeadList, splHeadList } = rainChkgdn; const [updateData, setUpdateData] = useState(); const initStats = (): z.infer => ({ @@ -97,7 +96,6 @@ export default function ChkgdModal({ type, obj }: { type: string; obj: any }) { target = { utztnUsgCd: code, ruseTotal: 0, splTotal: 0 }; acc.push(target); } - // 월별 값 누적 target[ruseMonthKey] = (target[ruseMonthKey] ?? 0) + ruseValue; target[splMonthKey] = (target[splMonthKey] ?? 0) + splValue; @@ -106,7 +104,18 @@ export default function ChkgdModal({ type, obj }: { type: string; obj: any }) { target.splTotal += splValue; return acc; }, []); - setGuidData(result); + + if (result) { + // '기타' 항목을 배열의 맨 뒤로 정렬합니다. + result.sort((a: splRuseWaterType, b: splRuseWaterType) => { + if (a.utztnUsgCd === "기타") return 1; // a를 b 뒤로 보냅니다. + if (b.utztnUsgCd === "기타") return -1; // b를 a 뒤로 보냅니다. + return 0; // 순서를 유지합니다. + }); + } + + console.log("result ", result); + setGuidData(result as splRuseWaterType[]); if (obj.rswtrPollutions) { const resultPolution: Record = { @@ -159,6 +168,14 @@ export default function ChkgdModal({ type, obj }: { type: string; obj: any }) { if (!resultPolution[nodeKey]) { resultPolution[nodeKey] = []; } + + // '기타' 항목을 배열의 맨 뒤로 정렬합니다. + resultPolution[nodeKey].sort((a: any, b: any) => { + if (a.utztnUsgCd === "기타") return 1; // a를 b 뒤로 보냅니다. + if (b.utztnUsgCd === "기타") return -1; // b를 a 뒤로 보냅니다. + return 0; // 순서를 유지합니다. + }); + resultPolution[nodeKey].push(average); }); diff --git a/apps/wr/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable.tsx b/apps/wr/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable.tsx index 5166b461f..720a73ab4 100644 --- a/apps/wr/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable.tsx +++ b/apps/wr/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable.tsx @@ -70,10 +70,15 @@ export default function RainChkgdTable({ }, [makeTableData, handleClick]); + useEffect(() =>{ + + + },[rainChkgdn.rainChk]) useEffect(() => { setSelectedIds([])// 셀렉트 초기화를 위한 작업 if (rainChkData) { + const rainChg = rainChkData.map((item: any) => { const bud = tableData([item.building], { code }); return { @@ -82,6 +87,7 @@ export default function RainChkgdTable({ rowspan: item.rainyDetails?.length, }; }); + setMakeTableData(rainChkTableData(rainChg)); } }, [rainChkData, code]); @@ -106,7 +112,6 @@ export default function RainChkgdTable({ ); if (findRain != undefined) { - console.log(findRain) return { ...rd, ph: Number(findRain.ph), diff --git a/apps/wr/public/sample_rainy.xlsx b/apps/wr/public/sample_rainy.xlsx index 73a52d89c3472af48a29d34e8e4edd82fbfbeacc..ec7577c510bf5ffefdbf146c56ac3d6569ce5b0b 100644 GIT binary patch delta 5270 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