From 9c19f239c2b89dafb8681220244f5a7b2f8f0141 Mon Sep 17 00:00:00 2001 From: leedj312 Date: Mon, 18 Aug 2025 14:53:00 +0900 Subject: [PATCH 01/31] =?UTF-8?q?=EA=B1=B4=EC=B6=95=EB=AC=BC=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EA=B2=80=EC=A6=9D=20=EC=86=8C=EC=8A=A4=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruseFcltMng/fcltReg/rainReg/page.tsx | 19 +++++------- .../ruseFcltMng/fcltReg/rswtReg/page.tsx | 6 ++-- apps/wr/app/store/common/code/basicCode.tsx | 29 +++++++++++++++++++ .../ruseFcltMng/fcltReg/rainReg/index.tsx | 8 ++--- .../ruseFcltMng/fcltReg/rainReg/type.tsx | 3 +- .../ruseFcltMng/fcltReg/rswtReg/index.tsx | 8 +++-- apps/wr/components/lib/func/commom.tsx | 26 ++++++++++++++++- .../ui/form/fcltReg/rainReg/rainRegForm.tsx | 22 ++++++-------- .../ui/form/fcltReg/rswtrReg/rswtrRegForm.tsx | 19 ++++-------- .../fcltReg/bdstRegModal/bdstRegModal.tsx | 4 +-- 10 files changed, 92 insertions(+), 52 deletions(-) diff --git a/apps/wr/app/(with-layout)/ruseFcltMng/fcltReg/rainReg/page.tsx b/apps/wr/app/(with-layout)/ruseFcltMng/fcltReg/rainReg/page.tsx index e3daab9f9..f2d121887 100644 --- a/apps/wr/app/(with-layout)/ruseFcltMng/fcltReg/rainReg/page.tsx +++ b/apps/wr/app/(with-layout)/ruseFcltMng/fcltReg/rainReg/page.tsx @@ -1,7 +1,7 @@ "use client"; import { useWrStore } from "@/app/store"; -import { type customRainBdst } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; -import { formatCommaNumber, tableData } from "@/components/lib/func/commom"; +import { rainRegSize, type customRainBdst } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; +import { formatArchArea, tableData } from "@/components/lib/func/commom"; import RainRegForm from "@/components/ui/form/fcltReg/rainReg/rainRegForm"; import { BdstReg } from "@/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal"; import { @@ -49,14 +49,11 @@ export default function Home() { if (rainRes && rainRes.length > 0) { const rainData = tableData(rainRes, { code }).map( (item: customRainBdst) => { - const archArea = - item?.archArea.split(".")[0] !== "-1" - ? item?.archArea.split(".")[0] - : "확인불가"; return { ...item, - archArea: formatCommaNumber(archArea), + archArea: formatArchArea(item?.archArea,1), bdstChgYn: item.chgBuilding[0]?.bdstChgNm != null ? "Y" : "N", + frstArchPrmsnDt:item?.frstArchPrmsnDt||'확인불가' }; } ); @@ -129,7 +126,7 @@ export default function Home() { { @@ -140,9 +137,9 @@ export default function Home() { {/* */} -
- - +
+ +
- + { // const rainRes =await getFetch("wr", `/reuseFc/rainyInfoList/1/10/${code}`); - const rainRes = await getFetchWithCount("wr", `/reuseFc/rainyInfoList/1/11/${code}`); + const rainRes = await getFetchWithCount("wr", `/reuseFc/rainyInfoList/1/${rainRegSize}/${code}`); return rainRes; }; export const rainFacActionsExport: (set: any) => rainFacSActions = ( @@ -108,7 +108,7 @@ export const rainFacActionsExport: (set: any) => rainFacSActions = ( return { getRainData: async (pageNation: number, code: string | number) => { try { - const rainRes = await getFetchWithCount("wr", `/reuseFc/rainyInfoList/${pageNation}/11/${code}`); + const rainRes = await getFetchWithCount("wr", `/reuseFc/rainyInfoList/${pageNation}/${rainRegSize}/${code}`); // 여기서 상태 업데이트 return set((state: rainFacState) => ({ @@ -149,7 +149,7 @@ export const rainFacActionsExport: (set: any) => rainFacSActions = ( try { // const rainRes = await getFetch('wr' , `/reuseFc/rainyInfoList/${pageNation}/20/41` +(txt? `/${txt}`:'')) - const rainRes = await getFetchWithCount('wr', `/reuseFc/rainyInfoList/${pageNation}/11/41` + (txt ? `/${txt}` : '')) + const rainRes = await getFetchWithCount('wr', `/reuseFc/rainyInfoList/${pageNation}/${rainRegSize}/41` + (txt ? `/${txt}` : '')) console.log("rainRes", rainRes) set((state: rainFacState) => { return { diff --git a/apps/wr/app/store/ruseFcltMng/fcltReg/rainReg/type.tsx b/apps/wr/app/store/ruseFcltMng/fcltReg/rainReg/type.tsx index 7850fec93..011d29da4 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltReg/rainReg/type.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltReg/rainReg/type.tsx @@ -6,14 +6,13 @@ export const validationMessages = { requiredSelect: (field: string) => `${field}을(를) 선택해주세요.`, yearFormat: '4자리 연도만 입력하세요', }; - export const baseReuseBuildingSchema = z.object({ bdstRuseFcltSn: z.number().nullish(), bdstInfoSn: z.number().nullish(), instlCmptnDt: z.coerce.date().default(() => new Date()), instlCst: z .number() - .max(9_999_999, { message: "최대 9,999,999까지 입력 가능합니다." }) + .max(999_999_999_999, { message: "최대 1,000,000,000,000까지 입력 가능합니다." }) .nullish(), operMngCd: z.string().optional().default(""), anlOperCst: z.number().default(0), diff --git a/apps/wr/app/store/ruseFcltMng/fcltReg/rswtReg/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltReg/rswtReg/index.tsx index 21983d466..7ef9bf0d9 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltReg/rswtReg/index.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltReg/rswtReg/index.tsx @@ -7,6 +7,8 @@ import { z } from "zod"; import { makeMdfr, makeRstr } from "../bdstReg"; import { baseReuseBuildingSchema, chgBuildingSchema, validationMessages } from "../rainReg/type"; + +export const rswtRegSize =15; const rswtrObjSchema = z.object({ bdstRuseFcltSn: z.number().nullish(), //wtrUsqty: z.number({ required_error: validationMessages.required("물사용량(m³)") }).positive({ message: validationMessages.required("물사용량(m³)") }), @@ -84,7 +86,7 @@ export const rswtFacStateExport: rswtFacState = { }; const initFetch = async (code: string | number) => { - const rswtRes = await getFetchWithCount("wr", `/reuseFc/waterreuseFc/1/11/${code}`); + const rswtRes = await getFetchWithCount("wr", `/reuseFc/waterreuseFc/1/${rswtRegSize}/${code}`); return rswtRes; }; export const rswtFacActionsExport: (set: any) => rswtFacSActions = ( @@ -99,7 +101,7 @@ export const rswtFacActionsExport: (set: any) => rswtFacSActions = ( try { const rswtRes = await getFetchWithCount( "wr", - `/reuseFc/waterreuseFc/${pageNation}/11/${code}` + + `/reuseFc/waterreuseFc/${pageNation}/${rswtRegSize}/${code}` + (txt ? `/${txt}` : "") ); set((state: rswtFacState) => { @@ -121,7 +123,7 @@ export const rswtFacActionsExport: (set: any) => rswtFacSActions = ( try { const rswtRes = await getFetchWithCount( "wr", - `/reuseFc/waterreuseFc/${pageNation}/11/${code}` + `/reuseFc/waterreuseFc/${pageNation}/${rswtRegSize}/${code}` ); console.log(pageNation); // 여기서 상태 업데이트 diff --git a/apps/wr/components/lib/func/commom.tsx b/apps/wr/components/lib/func/commom.tsx index ef4baa67b..042e74aa6 100644 --- a/apps/wr/components/lib/func/commom.tsx +++ b/apps/wr/components/lib/func/commom.tsx @@ -272,4 +272,28 @@ export const formatYyyymmdd = (val: string | undefined) => { } const m = moment(val); return m.isValid() ? m.format("YYYY-MM-DD") : val; -}; \ No newline at end of file +}; + +/** + * 문자열 숫자(콤마 포함 가능)를 반올림 처리해 반환. + * 숫자가 아닌 경우(예: "확인불가")는 원래 값을 그대로 반환. + * + * @param value 입력 문자열 + * @param digits 소수점 자릿수 (기본 0 = 정수 반올림) + */ +export const formatArchArea =(value: string, digits: number=0 ) => { + + // "확인불가" 등 숫자 아님 → 그대로 반환 + const cleaned = value.replace(/,/g, ""); + const num = parseFloat(cleaned); + + if (isNaN(num)) { + return value; + } + + // 반올림 (digits 자릿수까지) + const rounded = num.toFixed(digits); + + // 다시 천 단위 콤마 찍어서 반환 + return Number(rounded).toLocaleString(); +} \ No newline at end of file diff --git a/apps/wr/components/ui/form/fcltReg/rainReg/rainRegForm.tsx b/apps/wr/components/ui/form/fcltReg/rainReg/rainRegForm.tsx index 7c53cbe21..5083e24fc 100644 --- a/apps/wr/components/ui/form/fcltReg/rainReg/rainRegForm.tsx +++ b/apps/wr/components/ui/form/fcltReg/rainReg/rainRegForm.tsx @@ -14,9 +14,9 @@ import { } from "@/components/lib/func/commom"; import { DatePicker, FormUi } from "@common/business_components"; import { Form, FormField, SelectBox } from "@common/business_components/ui"; -import { Button, Input, ScrollArea } from "@common/components/ui"; +import { Button, Input } from "@common/components/ui"; import { zodResolver } from "@hookform/resolvers/zod"; -import { useEffect, useState } from "react"; +import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import BdstReg from "../bdstReg/bdstReg"; @@ -54,18 +54,12 @@ export default function RainRegForm({ "reuseBuilding.0.rainyObj.filtrTrtmfctYn", ]); - const [divStyle, setDivStyle] = useState("h-[53vh]"); + // const [divStyle, setDivStyle] = useState("h-[53vh]"); useEffect(() => { if(isMap=== true){ - setDivStyle("h-[100vh]") - }else if (isModal === true) { - setDivStyle("h-[53vh] max-h-[37vh]") - } else if (readonly === true) { - setDivStyle("h-[62vh]") - } else { - setDivStyle("h-[57vh]") + } - }, [isModal, readonly ,isMap]); + }, [isMap]); const cleanRainData = (raw: any): z.infer => { const buildings = @@ -94,6 +88,8 @@ export default function RainRegForm({ grntchBdstCertYn: item?.grntchBdstCertYn ?? "Y", rainyObj: { ...item?.rainyObj, + pntfColKnd:item.rainyObj?.pntfColKnd??'확인불가', + filtrTrtmfctPrs:item.rainyObj?.filtrTrtmfctPrs??'', filtrTrtmfctYn: item?.rainyObj?.filtrTrtmfctYn ?? "Y", }, })), @@ -180,7 +176,7 @@ export default function RainRegForm({ )}
- + {/* */} {isModal && rainForm != undefined ? : <>} {isModal ? (

@@ -614,7 +610,7 @@ export default function RainRegForm({

- + {/* */} diff --git a/apps/wr/components/ui/form/fcltReg/rswtrReg/rswtrRegForm.tsx b/apps/wr/components/ui/form/fcltReg/rswtrReg/rswtrRegForm.tsx index 0d1b47f4a..5ae5cd264 100644 --- a/apps/wr/components/ui/form/fcltReg/rswtrReg/rswtrRegForm.tsx +++ b/apps/wr/components/ui/form/fcltReg/rswtrReg/rswtrRegForm.tsx @@ -19,9 +19,9 @@ import { FormUi, SelectBox, } from "@common/business_components/ui"; -import { Button, Input, ScrollArea } from "@common/components/ui"; +import { Button, Input } from "@common/components/ui"; import { zodResolver } from "@hookform/resolvers/zod"; -import { useEffect, useState } from "react"; +import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import BdstAdd from "../bdstReg/bdstAdd"; @@ -46,18 +46,11 @@ export default function RswtrRegForm({ const { code, rswtBdstUpdate, rswtBdstReg } = useWrStore( (state) => state ); - const [divStyle, setDivStyle] = useState("h-[53vh]"); + // const [divStyle, setDivStyle] = useState("h-[53vh]"); useEffect(() => { if(isMap){ - setDivStyle("h-[100vh]") - }else if (isModal === true) { - setDivStyle("h-[53vh] max-h-[37vh]") - } else if (readonly === true) { - setDivStyle("h-[62vh]") - } else { - setDivStyle("h-[57vh]") } - }, [isModal, readonly ,isMap]); + }, [isMap]); // const defaultValues: z.infer = rswtZod.parse({}); const form = useForm>({ @@ -176,7 +169,7 @@ export default function RswtrRegForm({ )} - + {/* */} {isModal && rswtForm != undefined ? : <>} {isModal ? (

@@ -506,7 +499,7 @@ export default function RswtrRegForm({ - + {/* */} diff --git a/apps/wr/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal.tsx b/apps/wr/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal.tsx index d1de75ba1..31f9f2d16 100644 --- a/apps/wr/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal.tsx +++ b/apps/wr/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal.tsx @@ -196,7 +196,7 @@ export function BdstReg({
- {/* */} +
{moType === "RNB" ? ( ({ > )}
- {/*
*/} +
); From 4845450ea55291feb6bb6ca2e23ce8d1592b82b9 Mon Sep 17 00:00:00 2001 From: swcho Date: Tue, 19 Aug 2025 18:23:47 +0900 Subject: [PATCH 02/31] =?UTF-8?q?feat,=20refactor:=20-=20=EC=88=98?= =?UTF-8?q?=EC=9A=A9=EA=B0=80-=EB=A7=A8=ED=99=80=20=EB=A7=A4=EC=B9=AD?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=EC=96=91=EC=8B=9D=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20-=20=ED=8C=8C=EC=9D=BC=20=EB=8B=A4?= =?UTF-8?q?=EC=9A=B4=EB=A1=9C=EB=93=9C=20=EB=B2=84=ED=8A=BC=20=EC=83=89?= =?UTF-8?q?=EC=83=81=20green=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../map/searchModal/searchModal.tsx | 6 +- .../(with-base-layout)/ii/irsetting/page.tsx | 83 ++++++++++-------- .../app/(with-base-layout)/ii/rdii/page.tsx | 26 ++++-- .../(with-base-layout)/oper/floodPre/page.tsx | 2 +- .../(with-base-layout)/oper/oldPp/page.tsx | 2 +- apps/sn/app/components/ui/formSection.tsx | 5 +- .../manhole-consumer-matching-template.xlsx | Bin 0 -> 10087 bytes 7 files changed, 70 insertions(+), 54 deletions(-) create mode 100644 apps/sn/public/samples/manhole-consumer-matching-template.xlsx diff --git a/apps/sn/app/(map-layout)/map/searchModal/searchModal.tsx b/apps/sn/app/(map-layout)/map/searchModal/searchModal.tsx index 8b38d232d..61f7f5acf 100644 --- a/apps/sn/app/(map-layout)/map/searchModal/searchModal.tsx +++ b/apps/sn/app/(map-layout)/map/searchModal/searchModal.tsx @@ -1084,7 +1084,7 @@ const SearchModal: React.FC = ({ resetPageNo={isResetPage} resetSelection={isResetSelection} headButton={ - + } /> @@ -1112,7 +1112,7 @@ const SearchModal: React.FC = ({ resetPageNo={isResetPage} resetSelection={isResetSelection} headButton={ - + } /> @@ -1138,7 +1138,7 @@ const SearchModal: React.FC = ({ resetPageNo={isResetDetailPage} resetSelection={isResetDetailSelection} headButton={ - + } /> 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 6af066e4d..1f089fbd6 100644 --- a/apps/sn/app/(with-base-layout)/ii/irsetting/page.tsx +++ b/apps/sn/app/(with-base-layout)/ii/irsetting/page.tsx @@ -2,11 +2,11 @@ import { postData } from '@/components/lib/api' import FileUploadForm from '@/components/ui/fileUploadForm' import FormSection from '@/components/ui/formSection' -import { DateMonthPicker, filePicked } from '@common/business_components/ui' +import { DateMonthPicker, filePicked, downloadExcel } from '@common/business_components/ui' import ListDiv from '@common/business_components/ui/list_div' -import { Input } from '@common/components/ui' +import { Input, Button } from '@common/components/ui' import { zodResolver } from '@hookform/resolvers/zod' -import { useState } from 'react' +import { useState, useCallback } from 'react' import { useForm } from 'react-hook-form' import { z } from 'zod' import { excelToFlowRateData, excelToMatchingResultData, excelToTimePatternData, excelToRcptrInfoData } from '@/components/lib/utils' @@ -306,7 +306,7 @@ const IrSetting = () => { : null; const rcptrInfoData = file5?.file ? parsedResults.find(r => r && r.fileName === file5.file?.name)?.parsedData - : null; + : null; // 새로운 JSON 데이터 생성 const combinedAnalysisData = { @@ -342,9 +342,8 @@ const IrSetting = () => { return; } } - // const handleAnalysisClick = () => { - // } - //const rcptrInfoShow = true; + + return ( <> @@ -368,34 +367,7 @@ const IrSetting = () => { onAnalysis={handleAnalysisClick} > {[
- - handleFileSelection(0, file, cd, id)} - showButton={false} - showPreview={true} - accept={".inp"} - fileIdx={0} /> - - - handleFileSelection(1, file, cd, id)} - showButton={false} - showPreview={true} - accept={".xls, .xlsx, .xlsm, .xltx"} - fileIdx={1} /> - - - handleFileSelection(2, file, cd, id)} - showButton={false} - showPreview={true} - accept={".xls, .xlsx, .xlsm, .xltx"} - fileIdx={2} /> - - + {/* 연월 선택 라이브러리로 수정 필요 */} { startYear={1900} // 시작 연도 설정 /> - + handleFileSelection(4, file, cd, id)} @@ -417,7 +389,42 @@ const IrSetting = () => { accept={".xls, .xlsx, .xlsm, .xltx"} fileIdx={4} /> - + + handleFileSelection(0, file, cd, id)} + showButton={false} + showPreview={true} + accept={".inp"} + fileIdx={0} /> + + +
+ handleFileSelection(1, file, cd, id)} + showButton={false} + showPreview={true} + accept={".xls, .xlsx, .xlsm, .xltx"} + fileIdx={1} /> + +
+
+ + handleFileSelection(2, file, cd, id)} + showButton={false} + showPreview={true} + accept={".xls, .xlsx, .xlsm, .xltx"} + fileIdx={2} /> + + { @@ -445,7 +452,7 @@ const IrSetting = () => { placeholder="예: 0.75" /> - + setInput2(e.target.value)} diff --git a/apps/sn/app/(with-base-layout)/ii/rdii/page.tsx b/apps/sn/app/(with-base-layout)/ii/rdii/page.tsx index 7354db6cd..26c49d7c1 100644 --- a/apps/sn/app/(with-base-layout)/ii/rdii/page.tsx +++ b/apps/sn/app/(with-base-layout)/ii/rdii/page.tsx @@ -5,7 +5,7 @@ import FileUploadForm from "@/components/ui/fileUploadForm" import FormSection from "@/components/ui/formSection" import BaseLayout from "../BaseLayout" import { DateMonthPicker, filePicked } from "@common/business_components/ui" -import { Input } from "@common/components/ui" +import { Input, Button } from "@common/components/ui" import { zodResolver } from "@hookform/resolvers/zod" import { Label } from '@radix-ui/react-label' import { useState } from "react" @@ -392,15 +392,16 @@ export default function RTKForm() { > {[
- + - +
+ *
+ *
-
+
handleFileSelection(0, file, cd, id)} @@ -430,7 +432,7 @@ export default function RTKForm() { accept={".inp"} fileIdx={0} />
-
+
handleFileSelection(1, file, cd, id)} @@ -438,8 +440,14 @@ export default function RTKForm() { showPreview={true} accept={".xls, .xlsx, .xlsm, .xltx"} fileIdx={1} /> +
-
+
handleFileSelection(2, file, cd, id)} @@ -448,7 +456,7 @@ export default function RTKForm() { accept={".xls, .xlsx, .xlsm, .xltx"} fileIdx={2} />
- + { @@ -478,7 +486,7 @@ export default function RTKForm() { placeholder="0 ~ 1 사이의 값 입력" /> - + - + {

사업정보 등록현황

- +
diff --git a/apps/sn/app/(with-base-layout)/oper/oldPp/page.tsx b/apps/sn/app/(with-base-layout)/oper/oldPp/page.tsx index efcea5461..7165188ca 100644 --- a/apps/sn/app/(with-base-layout)/oper/oldPp/page.tsx +++ b/apps/sn/app/(with-base-layout)/oper/oldPp/page.tsx @@ -205,7 +205,7 @@ const Page = () => {

사업정보 등록현황

- +
diff --git a/apps/sn/app/components/ui/formSection.tsx b/apps/sn/app/components/ui/formSection.tsx index 384808aee..4f33fbbe5 100644 --- a/apps/sn/app/components/ui/formSection.tsx +++ b/apps/sn/app/components/ui/formSection.tsx @@ -6,12 +6,13 @@ interface FormSectionProps { titleNm: string form: any name: string + required?: boolean } -const FormSection = ({ children, titleNm, form, name }: FormSectionProps) => { +const FormSection = ({ children, titleNm, form, name, required }: FormSectionProps) => { return (
-
{titleNm}
+
{titleNm}{required && *}
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 Date: Wed, 20 Aug 2025 10:50:39 +0900 Subject: [PATCH 03/31] =?UTF-8?q?refactor:=20=EC=88=98=EC=9A=A9=EA=B0=80-?= =?UTF-8?q?=EB=A7=A8=ED=99=80=20=EC=96=91=EC=8B=9D=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=ED=97=A4=EB=8D=94=20=EC=83=89=EC=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manhole-consumer-matching-template.xlsx | Bin 10087 -> 9521 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/sn/public/samples/manhole-consumer-matching-template.xlsx b/apps/sn/public/samples/manhole-consumer-matching-template.xlsx index d4923c8626756b5e42d4890a5f05f125e0be88b9..5a6d80be7d5c129a32e9ce62a5a5ff822209d9a1 100644 GIT binary patch delta 3045 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 Ys=%ArCD1KmRX!}0AV0Y%=x@Ql0RKLzL;wH) From c4732ebb8f14e0db90c0b07adc8c9f62c402a8e8 Mon Sep 17 00:00:00 2001 From: swcho Date: Wed, 20 Aug 2025 11:07:51 +0900 Subject: [PATCH 04/31] =?UTF-8?q?feat:=20-=20=EC=9A=B4=EC=98=81=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EA=B2=B0=EA=B3=BC=20=EA=B4=80=EB=A1=9C=20=ED=81=B4?= =?UTF-8?q?=EB=A6=AD=EC=8B=9C=20=ED=95=B4=EB=8B=B9=20=EA=B4=80=EB=A1=9C?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20-=20searchModal=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=9C=A0=EC=A7=80=EB=90=98=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../map/searchModal/searchModal.tsx | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/apps/sn/app/(map-layout)/map/searchModal/searchModal.tsx b/apps/sn/app/(map-layout)/map/searchModal/searchModal.tsx index 61f7f5acf..7c4762a3c 100644 --- a/apps/sn/app/(map-layout)/map/searchModal/searchModal.tsx +++ b/apps/sn/app/(map-layout)/map/searchModal/searchModal.tsx @@ -149,18 +149,7 @@ const SearchModal: React.FC = ({ setIsResetDetailSelection(true); // 선택 초기화 setDetailBizId(0); // queryParams는 fetchFilteredData 내에서 매번 새로 생성되므로 별도 상태 초기화는 필요 없음 - }, [activeTab, basicType, workType, open]); - - useEffect(() => { - setActiveTab(TABS[0]?.val ?? "basic"); - setBasicType(BASIC_TYPES[0]?.val ?? ""); - setWorkType(WORK_TYPES[0]?.val ?? ""); - setTableCount(0); - setTableData([]); - setDetailTableCount(0); - setDetailTableData([]); - setDetailBizId(0); - }, [open]); + }, [activeTab, basicType, workType]); // 페이지 변경 시마다 데이터 fetch useEffect(() => { @@ -521,8 +510,7 @@ const SearchModal: React.FC = ({ RequestDTO.workTypes = JSON.parse(workType.replace(/'/g, '"')); const res = await getData(`v1/bizInfo/fclts?${new URLSearchParams(RequestDTO).toString()}`); - console.log('운영정보 cellClick 데이터1:', res); - console.log('운영정보 cellClick 데이터2:', res.data); + console.log('운영정보 cellClick 데이터:', res.data); const mappedData = (res.data || []).map((item: any, detailIndex: number) => { const formattedItem = formatDisplayData(item); @@ -587,6 +575,18 @@ const SearchModal: React.FC = ({ } }; + const handleOperationResultCellClick = async (index?: number | undefined, headId?: String) => { + if (typeof index === "number") { + + const row = detailTableData[index]; + const layerNm = row.lyrTypeNm; + const fid = row.fid; + const core = GisApp.Module.layer as any; + core.showSearchResultsFromGeoJSON(layerNm, fid); + onOpenChange(false); // SearchModal 닫기 + } + }; + // 기본정보 Excel 다운로드 핸들러 const BasicExcelDownload = async () => { if (tableData.length === 0) { @@ -1006,7 +1006,7 @@ const SearchModal: React.FC = ({ <> {/* 탭 영역 */} ({ value: tab.val, label: tab.text @@ -1133,7 +1133,7 @@ const SearchModal: React.FC = ({ headlist={dynamicHeadlist2} pageSize={OPERATION_TABLE_SIZE} total={detailTableCount} - cellClick={undefined} + cellClick={handleOperationResultCellClick} onPageChange={setDetailCurPage} resetPageNo={isResetDetailPage} resetSelection={isResetDetailSelection} From 3fb331b4bc2ddf732e7339c290ee7f10c50e3d7c Mon Sep 17 00:00:00 2001 From: swcho Date: Wed, 20 Aug 2025 18:42:35 +0900 Subject: [PATCH 05/31] =?UTF-8?q?feat:=20=EA=B8=B0=EB=B3=B8=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=EC=84=A4=20=EC=A7=80?= =?UTF-8?q?=EB=8F=84=EC=97=90=EC=84=9C=20=EB=B3=B4=EA=B8=B0=20(=EC=9D=B4?= =?UTF-8?q?=EC=A0=84=20=EC=8B=9C=EC=84=A4=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94=20=ED=95=B4=EC=95=BC=20=ED=95=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../map/searchModal/searchModal.tsx | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/apps/sn/app/(map-layout)/map/searchModal/searchModal.tsx b/apps/sn/app/(map-layout)/map/searchModal/searchModal.tsx index 7c4762a3c..2fb4e7cae 100644 --- a/apps/sn/app/(map-layout)/map/searchModal/searchModal.tsx +++ b/apps/sn/app/(map-layout)/map/searchModal/searchModal.tsx @@ -479,14 +479,16 @@ const SearchModal: React.FC = ({ }; // 기본정보 테이블 cellClick 핸들러 - const handleBasicCellClick = (index?: number | undefined, headId?: String) => { + const handleBasicCellClick = async (index?: number | undefined, headId?: String) => { if (typeof index === "number") { + setIsLoading(true); const row = tableData[index]; const layerNm = row.lyrTypeNm; const fid = row.fid; const core = GisApp.Module.layer as any; - core.showSearchResultsFromGeoJSON(layerNm, fid); + await core.showSearchResultsFromGeoJSON(layerNm, fid); + setIsLoading(false); onOpenChange(false); // SearchModal 닫기 } }; @@ -577,18 +579,20 @@ const SearchModal: React.FC = ({ const handleOperationResultCellClick = async (index?: number | undefined, headId?: String) => { if (typeof index === "number") { + setIsLoading(true); const row = detailTableData[index]; const layerNm = row.lyrTypeNm; const fid = row.fid; const core = GisApp.Module.layer as any; - core.showSearchResultsFromGeoJSON(layerNm, fid); + await core.showSearchResultsFromGeoJSON(layerNm, fid); + setIsLoading(false); onOpenChange(false); // SearchModal 닫기 } }; // 기본정보 Excel 다운로드 핸들러 - const BasicExcelDownload = async () => { + const basicExcelDownload = async () => { if (tableData.length === 0) { alert("다운로드 할 Excel 파일이 없습니다.\n조회 후 다시 시도해주세요."); return; @@ -804,7 +808,7 @@ const SearchModal: React.FC = ({ }; // 운영정보 Excel 다운로드 핸들러 추가 - const OperationExcelDownload = async () => { + const operationExcelDownload = async () => { if (tableData.length === 0) { alert("다운로드 할 Excel 파일이 없습니다.\n조회 후 다시 시도해주세요."); return; @@ -898,7 +902,7 @@ const SearchModal: React.FC = ({ }; // 운영정보 Excel 다운로드 핸들러 추가 - const OperationResultExcelDownload = async () => { + const operationResultExcelDownload = async () => { if (detailTableData.length === 0) { alert("다운로드 할 Excel 파일이 없습니다.\n조회 후 다시 시도해주세요."); return; @@ -1001,6 +1005,20 @@ const SearchModal: React.FC = ({ } }; + const viewMultipleFeature = async () => { + if (!(tableData.length === 0)) { + setIsLoading(true); + + const row = tableData[0]; + const layerNm = row.lyrTypeNm; + const fids = tableData.map((item) => item.fid); + const core = GisApp.Module.layer as any; + await core.showMultipleSearchResultsFromGeoJSON(layerNm, fids); + setIsLoading(false); + onOpenChange(false); + } + } + const renderBody = () => ( <> @@ -1084,7 +1102,10 @@ const SearchModal: React.FC = ({ resetPageNo={isResetPage} resetSelection={isResetSelection} headButton={ - +
+ + +
} />
@@ -1112,7 +1133,7 @@ const SearchModal: React.FC = ({ resetPageNo={isResetPage} resetSelection={isResetSelection} headButton={ - + } />
@@ -1138,7 +1159,7 @@ const SearchModal: React.FC = ({ resetPageNo={isResetDetailPage} resetSelection={isResetDetailSelection} headButton={ - + } />
From ebfc520d676842cc71556474359fbfd28f0ca244 Mon Sep 17 00:00:00 2001 From: swcho Date: Wed, 20 Aug 2025 18:50:08 +0900 Subject: [PATCH 06/31] =?UTF-8?q?feat:=20-=20=EC=97=AC=EB=9F=AC=20?= =?UTF-8?q?=EA=B0=9C=EC=9D=98=20=EA=B2=80=EC=83=89=20=EA=B2=B0=EA=B3=BC?= =?UTF-8?q?=EB=A5=BC=20GeoJSON=EC=9C=BC=EB=A1=9C=20=ED=91=9C=EC=8B=9C=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80=20-=20=ED=94=BC?= =?UTF-8?q?=EC=B3=90=20ID=EB=A1=9C=20=EC=A7=80=EC=98=A4=EC=84=9C=EB=B2=84?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EA=B2=80=EC=83=89=ED=95=B4=EC=84=9C=20?= =?UTF-8?q?=EC=97=AC=EB=9F=AC=EA=B0=9C=20=ED=94=BC=EC=B2=98=EC=9D=98=20?= =?UTF-8?q?=EB=B2=A1=ED=84=B0=EC=86=8C=EC=8A=A4=20=EB=A6=AC=ED=84=B4?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?-=20=EC=97=AC=EB=9F=AC=20extent=20=EB=B0=B0=EC=97=B4=EC=9D=84?= =?UTF-8?q?=20=EB=B0=9B=EC=95=84=20=EC=A4=91=EC=95=99=EA=B0=92=20extent?= =?UTF-8?q?=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/ui/map/lib/gis.layer.js | 226 +++++++++++++++++- 1 file changed, 218 insertions(+), 8 deletions(-) diff --git a/packages/common/business_components/src/ui/map/lib/gis.layer.js b/packages/common/business_components/src/ui/map/lib/gis.layer.js index 6cbc054f8..538fad976 100644 --- a/packages/common/business_components/src/ui/map/lib/gis.layer.js +++ b/packages/common/business_components/src/ui/map/lib/gis.layer.js @@ -569,14 +569,224 @@ GisOlLayer.prototype = { cesiumScene.camera.moveEnd.addEventListener(cesiumScene._moveEndListener); } }, - getFeatureById: function(featureId){ - this.layers - .getArray() - .forEach(layer => { - const source = layer.getSource(); - const feature = source.getFeatureById(String(featureId).trim()); - if (feature) return feature; - }); + getFeatureById: function (featureId) { + let returnFeature; + this.layers.getArray().some(function (layer) { + const source = layer.getSource(); + + if (source instanceof VectorSource) { + const feature = source.getFeatureById(featureId); + if (feature) { + returnFeature = feature; + return true; + } + } + }); + + return returnFeature; + }, + getOpenLayersZoom: function (cesiumScene) { + const cameraHeight = cesiumScene.camera.positionCartographic.height; + const maxResolution = 156543.03392804097; // OpenLayers 기본 해상도 (Google Mercator 기준) + const tileSize = 256; // 기본 타일 크기 + return Math.ceil(Math.log2(maxResolution / (cameraHeight / tileSize))); + }, + ensureSearchLayer: function () { + let layer = this.searchLayer; + + if (!layer) { + layer = new VectorLayer({ + source: new VectorSource(), + zIndex: 9999 + }); + let map = GisApp.Module.core.map; + map.addLayer(layer); + } + return layer; + }, + clearSearchLayer: function () { + const layer = this.ensureSearchLayer(); + layer.getSource().clear(true); + }, + showSearchResultsFromGeoJSON: function (lyrTyNm, featureId) { + const layer = this.ensureSearchLayer(); + + // 이전 검색결과는 깨끗이 + const prev = layer.getSource(); + if (prev) prev.clear(true); + + //레이어 타입 설정(point, line 등. 이걸 style에서 사용) + const layerCode = GisApp.layerCode; + const matched = Object.values(layerCode).find(obj => obj.lyrTyNm === lyrTyNm); + layer.set("gobjTy", matched.gobjTy); + + // 새 소스 만들기 + const source = this.getFeatureSourceFromGeoserver(lyrTyNm, featureId); + + // 1) 로드 완료시 extent 맞추기 + const onLoadEnd = () => { + const feats = source.getFeatures(); + if (feats && feats.length > 0) { + const select = GisApp.Module.select; + select.selectFeature(feats[0], false); + } else { + console.warn('[search-layer] GeoJSON에 피처가 없습니다.'); + } + // 한번만 쓰고 이벤트 정리 + source.un('featuresloadend', onLoadEnd); + source.un('featuresloaderror', onLoadError); + }; + + const onLoadError = (e) => { + console.error('[search-layer] GeoJSON 로드 실패:', e); + source.un('featuresloadend', onLoadEnd); + source.un('featuresloaderror', onLoadError); + }; + + // 이벤트를 먼저 걸고 → setSource + source.once('featuresloadend', onLoadEnd); + source.once('featuresloaderror', onLoadError); + + // 레이어에 소스 적용(이때부터 로딩 시작) + layer.setSource(source); + + // 필요시 명시적으로 재요청 + source.refresh(); + }, + /** + * 피쳐 ID로 지오서버에서 검색해서 피처의 벡터소스를 리턴 + * @param {} lyrTyNm + * @param {*} featureId + * @returns + */ + getFeatureSourceFromGeoserver: function (lyrTyNm, featureId) { + + const typeName = this.storageNm + lyrTyNm; + const srsName = GisApp.TO_PROJ; + const baseUrl = GisApp.GEOSERVER_URL; + const source = new VectorSource({ + format: new GeoJSON(), + url: () => { + const params = new URLSearchParams({ + SERVICE: 'WFS', + VERSION: '1.1.0', + REQUEST: 'GetFeature', + TYPENAME: typeName, + SRSNAME: srsName, + OUTPUTFORMAT: 'application/json', + FEATUREID: featureId, + }); + return `${baseUrl}?${params.toString()}`; + }, + strategy: all, + }); + + return source; + }, + /** + * 여러 개의 검색 결과를 GeoJSON으로 표시 + * @param {string} lyrTyNm 레이어 타입명 + * @param {Array|string} featureIds 피처 ID 배열 또는 단일 ID + */ + showMultipleSearchResultsFromGeoJSON: function (lyrTyNm, featureIds) { + const layer = this.ensureSearchLayer(); + + const prev = layer.getSource(); + if (prev) prev.clear(true); + + const layerCode = GisApp.layerCode; + const matched = Object.values(layerCode).find(obj => obj.lyrTyNm === lyrTyNm); + layer.set("gobjTy", matched.gobjTy); + + const source = this.getMultiFeatureSourceFromGeoserver(lyrTyNm, featureIds); + + const onLoadEnd = async () => { + const feats = source.getFeatures(); + if (feats && feats.length > 0) { + const select = GisApp.Module.select; + await select.resetSelectedFeature(); + for (const feature of feats) select.selectMultiFeature(feature, true); + const geometries = feats.map(f => f.getGeometry()); + if (geometries.length > 0) { + const extent = this.combineExtents(geometries.map(g => g?.getExtent())); + + let map = GisApp.Module.core.map; + map.getView().fit(extent, { + duration: 300, + padding: [50, 50, 50, 50], + maxZoom: 16 + }); + } + } else { + console.warn('[search-layer] GeoJSON에 피처가 없습니다.'); + } + source.un('featuresloadend', onLoadEnd); + source.un('featuresloaderror', onLoadError); + }; + + const onLoadError = (e) => { + console.error('[search-layer] GeoJSON 로드 실패:', e); + source.un('featuresloadend', onLoadEnd); + source.un('featuresloaderror', onLoadError); + }; + + source.once('featuresloadend', onLoadEnd); + source.once('featuresloaderror', onLoadError); + + layer.setSource(source); + + source.refresh(); + }, + /** + * 피쳐 ID로 지오서버에서 검색해서 여러개 피처의 벡터소스를 리턴 + * @param {} lyrTyNm + * @param {*} featureId + * @returns + */ + getMultiFeatureSourceFromGeoserver: function (lyrTyNm, featureId) { + + const typeName = this.storageNm + lyrTyNm; + const srsName = GisApp.TO_PROJ; + const baseUrl = GisApp.GEOSERVER_URL; + + const ids = Array.isArray(featureId) ? featureId : [featureId]; + + const source = new VectorSource({ + format: new GeoJSON(), + url: () => { + const params = new URLSearchParams({ + SERVICE: 'WFS', + VERSION: '1.1.0', + REQUEST: 'GetFeature', + TYPENAME: typeName, + SRSNAME: srsName, + OUTPUTFORMAT: 'application/json', + FEATUREID: ids.join(','), + }); + return `${baseUrl}?${params.toString()}`; + }, + strategy: all, + }); + + return source; + }, + /** + * 여러 extent 배열을 받아 결합된 extent를 반환 + * @param {Array>} extents [[minX,minY,maxX,maxY], ...] + * @returns {Array|null} + */ + combineExtents: function (extents) { + if (!extents || extents.length === 0) return null; + let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity; + for (const e of extents) { + if (!e || e.length < 4) continue; + minX = Math.min(minX, e[0]); + minY = Math.min(minY, e[1]); + maxX = Math.max(maxX, e[2]); + maxY = Math.max(maxY, e[3]); + } + if (!isFinite(minX) || !isFinite(minY) || !isFinite(maxX) || !isFinite(maxY)) return null; + return [minX, minY, maxX, maxY]; } }; From 1579df57c4022c18532b1955391bedd67231dd68 Mon Sep 17 00:00:00 2001 From: ljpark Date: Wed, 20 Aug 2025 21:25:55 +0900 Subject: [PATCH 07/31] =?UTF-8?q?=EA=B3=B5=EB=8B=A8=EA=B0=9C=EB=B0=9C=20se?= =?UTF-8?q?werage=20=EC=A3=BC=EC=86=8C=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/sn/.env.production | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sn/.env.production b/apps/sn/.env.production index 3fb05262e..13c6ff68d 100644 --- a/apps/sn/.env.production +++ b/apps/sn/.env.production @@ -12,4 +12,4 @@ NEXT_PUBLIC_GEOSERVER_URL = https://hasudo.geo.rsonesoft.com/geoserver NEXT_PUBLIC_LX_GEOSERVER_URL = http://172.29.143.87:8080/geoserver_swl NEXT_PUBLIC_DC_URL = https://apigateway.apps.rsonesoft.com NEXT_PUBLIC_NGII_URL = http://10.98.25.94:18080/openapi/Gettile.do?apiKey=BDE2BEF39DAFEC293AB6730150F222AC -NEXT_PUBLIC_SEWERAGE_API_URL = http://con.mind-one.co.kr:11083/sewerage-service/api +NEXT_PUBLIC_SEWERAGE_API_URL = https://apigateway.hasuon.or.kr/sewerage-service/api From 64813531f1b7a6631d5b2af0148f75cf116c2439 Mon Sep 17 00:00:00 2001 From: swcho Date: Thu, 21 Aug 2025 10:24:14 +0900 Subject: [PATCH 08/31] =?UTF-8?q?feat:=20=EC=B9=A8=EC=9E=85=EC=88=98?= =?UTF-8?q?=EB=B6=84=EC=84=9D,=20RDII=20=EB=B6=84=EC=84=9D=20=EC=96=91?= =?UTF-8?q?=EC=8B=9D=20=ED=8C=8C=EC=9D=BC=20=EC=B6=94=EA=B0=80=20=EB=B0=8F?= =?UTF-8?q?=20=EB=B2=84=ED=8A=BC=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/(with-base-layout)/ii/BaseLayout.tsx | 22 ++++++++++++++++++ .../(with-base-layout)/ii/irsetting/page.tsx | 7 +++--- .../app/(with-base-layout)/ii/rdii/page.tsx | 5 ++-- apps/sn/public/samples/ir_setting_sample.zip | Bin 0 -> 25759 bytes apps/sn/public/samples/rdii_sample.zip | Bin 0 -> 143458 bytes 5 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 apps/sn/public/samples/ir_setting_sample.zip create mode 100644 apps/sn/public/samples/rdii_sample.zip diff --git a/apps/sn/app/(with-base-layout)/ii/BaseLayout.tsx b/apps/sn/app/(with-base-layout)/ii/BaseLayout.tsx index bf056f4e7..af178ac59 100644 --- a/apps/sn/app/(with-base-layout)/ii/BaseLayout.tsx +++ b/apps/sn/app/(with-base-layout)/ii/BaseLayout.tsx @@ -58,6 +58,8 @@ type BaseLayout = { onDeleteFile?: () => void; onAnalysis?: () => void; selectedRowData?: any; + isIr?: boolean; + isRdii?: boolean; } const BaseLayout = ({ @@ -87,6 +89,8 @@ const BaseLayout = ({ onExcelDownload, onDeleteFile, onAnalysis, + isIr = false, + isRdii = false, }: BaseLayout) => { // 컴포넌트 언마운트 시 confirmToast 정리 @@ -207,6 +211,24 @@ const BaseLayout = ({ {graphBtn && ( )} + {/* 침입수 분석 */} + {isIr && ( + + )} + {/* RDII 분석 */} + {isRdii && ( + + )} {/* 분석 버튼 */} {analysisBtn && ( 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 1f089fbd6..e4094a8c2 100644 --- a/apps/sn/app/(with-base-layout)/ii/irsetting/page.tsx +++ b/apps/sn/app/(with-base-layout)/ii/irsetting/page.tsx @@ -365,6 +365,7 @@ const IrSetting = () => { setSwtrmtFcltNm={setSwtrmtFcltNm} setIsLoading={setIsLoadingResult} onAnalysis={handleAnalysisClick} + isIr={true} > {[
@@ -380,7 +381,7 @@ const IrSetting = () => { startYear={1900} // 시작 연도 설정 /> - + handleFileSelection(4, file, cd, id)} @@ -407,12 +408,12 @@ const IrSetting = () => { showPreview={true} accept={".xls, .xlsx, .xlsm, .xltx"} fileIdx={1} /> - + */}
diff --git a/apps/sn/app/(with-base-layout)/ii/rdii/page.tsx b/apps/sn/app/(with-base-layout)/ii/rdii/page.tsx index 26c49d7c1..8506a9026 100644 --- a/apps/sn/app/(with-base-layout)/ii/rdii/page.tsx +++ b/apps/sn/app/(with-base-layout)/ii/rdii/page.tsx @@ -389,6 +389,7 @@ export default function RTKForm() { setSwtrmtFcltNm={setSwtrmtFcltNm} setIsLoading={setIsLoadingResult} onAnalysis={handleAnalysisClick} + isRdii={true} > {[
@@ -440,12 +441,12 @@ export default function RTKForm() { showPreview={true} accept={".xls, .xlsx, .xlsm, .xltx"} fileIdx={1} /> - + */}
#(7?#l)&# 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 z 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[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 Date: Thu, 21 Aug 2025 13:07:14 +0900 Subject: [PATCH 09/31] =?UTF-8?q?feat:=20RDII=20=EB=B6=84=EC=84=9D=20?= =?UTF-8?q?=EC=83=81=EC=88=98=EC=82=AC=EC=9A=A9=EB=9F=89=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=EC=9B=94=20=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/(with-base-layout)/ii/rdii/page.tsx | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/apps/sn/app/(with-base-layout)/ii/rdii/page.tsx b/apps/sn/app/(with-base-layout)/ii/rdii/page.tsx index 8506a9026..72782a791 100644 --- a/apps/sn/app/(with-base-layout)/ii/rdii/page.tsx +++ b/apps/sn/app/(with-base-layout)/ii/rdii/page.tsx @@ -279,8 +279,25 @@ export default function RTKForm() { ); // 각 파싱 결과 접근 - const matchingResultData = parsedResults.find(r => r && r.fileName === file2.file?.name)?.parsedData; - const rainData = parsedResults.find(r => r && r.fileName === file3.file?.name)?.parsedData; + const matchingResultData = parsedResults.find(r => r && r.fileName === file2.file?.name)?.parsedData ?? []; + const rainData = parsedResults.find(r => r && r.fileName === file3.file?.name)?.parsedData ?? []; + + // 상수사용량 적용월과 강우자료의 날짜 일치 여부 검증 + let dateValidated = true; + + if (rainData) { + rainData + .filter(data => data && 'mtrngDt' in data) + .map(data => { + if (formData.date !== data.mtrngDt.replace(/-/g, '').slice(0, 6)) dateValidated = false; + }); + } + if (!dateValidated) { + setIsLoadingResult(false); + alert("'상수사용량 적용월'과 강우자료의 '날짜'가 일치하지 않습니다."); + return; + } + // 새로운 JSON 데이터 생성 const combinedAnalysisData = { From 68c99ad6c09becc7322fd76bd6f19fef05ab0c67 Mon Sep 17 00:00:00 2001 From: ljpark Date: Thu, 21 Aug 2025 17:14:50 +0900 Subject: [PATCH 10/31] =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EC=97=85=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=20sample?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../(with-base-layout)/ii/fileupload/page.tsx | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 apps/sn/app/(with-base-layout)/ii/fileupload/page.tsx diff --git a/apps/sn/app/(with-base-layout)/ii/fileupload/page.tsx b/apps/sn/app/(with-base-layout)/ii/fileupload/page.tsx new file mode 100644 index 000000000..e72f7f4a5 --- /dev/null +++ b/apps/sn/app/(with-base-layout)/ii/fileupload/page.tsx @@ -0,0 +1,99 @@ +'use client' + +// FileUpload.js +import React, { useState } from 'react'; +import axios from 'axios'; +const SEWERAGE_URL = process.env.NEXT_PUBLIC_SEWERAGE_API_URL || ""; + +function FileUpload() { + const [file, setFile] = useState(null); + const [text, setText] = useState(''); + + const handleFileChange = (e) => { + setFile(e.target.files[0]); + }; + + const handleTextChange = (e) => { + setText(e.target.value); + }; + + function getCookie(name:string) { + const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)')); + if (match && match[2]) { + return decodeURIComponent(match[2]); + } + return null; + } + const handleFindUser = (e) => { + const auth = getCookie("Authorization"); + if (auth) console.log("쿠키 auth : " + auth); + fetch(SEWERAGE_URL+"/v1/inftwtAnls/users/65a00f65-8460-49af-98ec-042977e56f4b", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({authToken: auth}) + }).then((data) => { + console.log(data); + }); + }; + const handleFindUserOna = (e) => { + const auth = getCookie("Authorization"); + if (auth) console.log("쿠키 auth : " + auth); + fetch("/server/user-service/api/v1/users/65a00f65-8460-49af-98ec-042977e56f4b").then((data) => { + console.log(data); + }); + }; + + const handleSubmit = async (e) => { + e.preventDefault(); + + if (!file) { + alert('파일을 선택하세요.'); + return; + } + + const jsonData = { + aplcnYm: '202507', + enoCd: 'ABC' + }; + + // JSON → Blob 으로 변환 + MIME 지정 + const jsonBlob = new Blob([JSON.stringify(jsonData)], { + type: 'application/json' + }); + + const formData = new FormData(); + formData.append('data', jsonBlob); + formData.append('inpFile', file); + + try { + const response = await axios.post('http://localhost:8883/sewerage-service/api/v1/rdiiAnls/savewithfile', formData); + + alert('업로드 성공: ' + response.data.message); + } catch (err) { + console.error(err); + alert('업로드 실패'); + } + }; + + return ( +

+
+ + +
+
+ + +
+ + + + + ); +} + +export default FileUpload; From 3d0dccaa356421201cd21cf30271ba4c47040974 Mon Sep 17 00:00:00 2001 From: ljpark Date: Fri, 22 Aug 2025 20:53:31 +0900 Subject: [PATCH 11/31] =?UTF-8?q?=EC=B9=A8=EC=9E=85=EC=88=98=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=EC=97=85=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../(with-base-layout)/ii/irsetting/page.tsx | 24 +++++++++++++++---- apps/sn/app/components/lib/api/index.ts | 4 +++- 2 files changed, 22 insertions(+), 6 deletions(-) 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 1f089fbd6..ae9b4107d 100644 --- a/apps/sn/app/(with-base-layout)/ii/irsetting/page.tsx +++ b/apps/sn/app/(with-base-layout)/ii/irsetting/page.tsx @@ -1,5 +1,5 @@ 'use client' -import { postData } from '@/components/lib/api' +import { postData , postMutiPart} from '@/components/lib/api' import FileUploadForm from '@/components/ui/fileUploadForm' import FormSection from '@/components/ui/formSection' import { DateMonthPicker, filePicked, downloadExcel } from '@common/business_components/ui' @@ -52,6 +52,11 @@ const IrSetting = () => { const [sggCd, setSggCd] = useState('0'); // 시군구 코드 상태 const [sggName, setSggName] = useState(''); // 시군구 이름 상태 const [swtrmtFcltNm, setSwtrmtFcltNm] = useState(''); // 하수처리시설명 상태 + const [file, setFile] = useState(null); + + const handleFileChange = (e) => { + setFile(e.target.files[0]); + }; const { data: userInfo } = useQuery({ queryKey: [ENDPOINT.USER_SERVICE.USERS], @@ -140,7 +145,16 @@ const IrSetting = () => { setIsLoadingResult(true); // 로딩 상태 시작 console.log("Submitting combined analysis data to backend:", analysisData); // 추후 API 엔드포인트에 맞게 URL 수정 필요 - const data = await postData('v1/inftwtAnls', analysisData); + // const data = await postData('v1/inftwtAnls', analysisData); + const jsonBlob = new Blob([JSON.stringify(analysisData)], { + type: 'application/json' + }); + const formData = new FormData(); + formData.append('data', jsonBlob); + if (file) { + formData.append('inpFile', file); + } + const data = await postMutiPart('v1/inftwtAnls/savewithfile', formData); console.log("Response from backend:", data); if (data) { setIsLoadingResult(false); // 로딩 상태 시작 @@ -318,8 +332,8 @@ const IrSetting = () => { anlsInfo: input2, // 분석정보 rgtr: tokenManager.getToken(AUTH_USER_ID) || null, // 등록자 (사용자 ID) rgtrNm: userInfo?.userName, // 등록자 (사용자 ID) - atflCd: file1?.atflCd, // 첨부파일CD (오수관망도) - atflId: file1?.atflId, // 첨부파일ID (오수관망도) + //atflCd: file1?.atflCd, // 첨부파일CD (오수관망도) + //atflId: file1?.atflId, // 첨부파일ID (오수관망도) atflInpNm: file1?.file?.name, // 오수관망도 파일명 atflHrPttnNm: file3?.file?.name, // 오수량 시간패턴 파일명 atflMpngNm: file2?.file?.name, // 수용가-맨홀 매칭결과 파일명 @@ -397,7 +411,7 @@ const IrSetting = () => { showPreview={true} accept={".inp"} fileIdx={0} /> - +
=> method: "POST", body: data, }; - const res = await fetch(`${BASE_URL}/${url}`, options); + //const res = await fetch(`${BASE_URL}/${url}`, options); + const res = await axios.post(`${BASE_URL}/${url}`, data); const resData = await res.json(); return resData; }; From 5aec4b957c073e9559cb16e558980e20869cfadb Mon Sep 17 00:00:00 2001 From: swcho Date: Mon, 25 Aug 2025 13:46:53 +0900 Subject: [PATCH 12/31] =?UTF-8?q?feat:=20=EB=8F=84=EC=8B=9C=EC=B9=A8?= =?UTF-8?q?=EC=88=98=EC=98=88=EB=B0=A9=EC=82=AC=EC=97=85=20=EC=97=91?= =?UTF-8?q?=EC=85=80=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=AA=A8=EB=8B=AC?= =?UTF-8?q?=EB=A1=9C=20=EB=9D=84=EC=9A=B0=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(=EC=85=80=20=EC=84=B8=EB=A1=9C=20merge=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=ED=95=84=EC=9A=94)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../(with-base-layout)/oper/floodPre/page.tsx | 28 +- .../oper/floodPre/tableModal.tsx | 244 ++++++++++++++++++ 2 files changed, 267 insertions(+), 5 deletions(-) create mode 100644 apps/sn/app/(with-base-layout)/oper/floodPre/tableModal.tsx diff --git a/apps/sn/app/(with-base-layout)/oper/floodPre/page.tsx b/apps/sn/app/(with-base-layout)/oper/floodPre/page.tsx index 98edf6eb7..a23f3330f 100644 --- a/apps/sn/app/(with-base-layout)/oper/floodPre/page.tsx +++ b/apps/sn/app/(with-base-layout)/oper/floodPre/page.tsx @@ -14,6 +14,7 @@ import { AUTH_USER_ID } from "@/shared/config"; import { useQuery } from "@tanstack/react-query"; import { ENDPOINT } from "@common/components/config"; import { getUserInfo } from "@common/components/api"; +import TableModal from './tableModal'; const Page = () => { @@ -32,7 +33,8 @@ const Page = () => { const [curPage, setCurPage] = useState(1) //현재 페이지 const [totalData, setTotalData] = useState(0) //총 데이터 수 const [isLoading, setIsLoading] = useState(true) //로딩 상태 - const [isModalOpen, setIsModalOpen] = useState(false) // 모달 상태 + const [isUploadModalOpen, setIsUploadModalOpen] = useState(false) // 등록 모달 상태 + const [isTableModalOpen, setIsTableModalOpen] = useState(false) // 테이블 모달 상태 const [resetSelection, setResetSelection] = useState(false); // 선택 초기화 상태 const [isResetPage, setIsResetPage] = useState(false); @@ -135,14 +137,14 @@ const Page = () => { const data = await postData('v1/sbmrgPrevnt', json) if (data) { alert('파일이 등록되었습니다.'); - setIsModalOpen(false); + setIsUploadModalOpen(false); handleSearch(); } } // 등록 버튼 클릭 핸들러 const handleRegisterClick = () => { - setIsModalOpen(true); + setIsUploadModalOpen(true); } @@ -228,6 +230,7 @@ const Page = () => { setFileNm(fileName); setAtflId(id); setSbmrgPrevntBizSn(tableData[index]?.sbmrgPrevntBizSn); + setIsTableModalOpen(true); } }} onPageChange={setCurPage} @@ -237,8 +240,8 @@ const Page = () => { {/* 파일 업로드 모달 */} { /> } /> + {/* 엑셀 데이터 테이블 모달 */} + } + useDirectRender={true} + /> ) } diff --git a/apps/sn/app/(with-base-layout)/oper/floodPre/tableModal.tsx b/apps/sn/app/(with-base-layout)/oper/floodPre/tableModal.tsx new file mode 100644 index 000000000..547b46610 --- /dev/null +++ b/apps/sn/app/(with-base-layout)/oper/floodPre/tableModal.tsx @@ -0,0 +1,244 @@ +'use client' +import { useState, useEffect } from 'react' +import LoadingOverlay from '@/components/ui/LoadingBar' +import { UITab, UiTable } from '@common/business_components/ui' +import * as XLSX from 'xlsx'; + +const TABS = [ + { val: "management", text: "관리SHEET" }, + { val: "Inspection results", text: "운영관리현황 점검결과" }, +]; + +interface TableModalProps { + fileNm: string; + atflId: string; +} + +const TableModal: React.FC = ({ fileNm, atflId }) => { + + const [activeTab, setActiveTab] = useState(TABS[0]?.val ?? "management"); + const [managementTableHeader, setManagementTableHeader] = useState<{ id: string; title: string }[]>([]) //테이블 헤더 + const [managementTableData, setManagementTableData] = useState([{}]) //테이블 데이터 + const [resultTableHeader, setResultTableHeader] = useState<{ id: string; title: string }[]>([]) //테이블 헤더 + const [resultTableData, setResultTableData] = useState([{}]) //테이블 데이터 + const [isLoading, setIsLoading] = useState(false) //로딩 상태 + + useEffect(() => { + isChckFile(); + }, []); + + // 파일 다운로드 + const isChckFile = async () => { + setIsLoading(true); + try { + if (fileNm === '' || fileNm === undefined) { + alert('파일을 선택해주세요') + setIsLoading(false); + return false + } + + const response = await fetch(`/attach-service/api/v1/download/${atflId}`); + if (!response.ok) { + throw new Error('파일을 가져오는 중 오류가 발생했습니다.'); + } + + const blob = await response.blob(); + + const file = new File([blob], fileNm, { + type: blob.type || 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' + }); + + const targetSheets = ['관리SHEET', '운영관리현황 점검결과']; + const jsonDataBySheet = await filePickedSelectedSheets(file, 0, targetSheets); + + // 관리 SHEET + const managementHeader = jsonDataBySheet['관리SHEET']?.[7] || []; + // 1번째~47번째, 74번째~80번째 데이터만 필터링 + const filteredManagementHeader = Object.entries(managementHeader) + .filter(([key, value]) => { + const match = key.match(/^__EMPTY_(\d+)$/); + if (match) { + const index = parseInt(match[1] ?? '', 10); + return (index > 0 && index < 47) || (index > 73); + } + return false; + }) + .map(([key, value]) => ({ + id: key, + title: String(value).replace(/\r\n/g, '\n') + })); + + setManagementTableHeader(filteredManagementHeader); + console.log('managementTableHeader', filteredManagementHeader); + + const managementData = Array.isArray(jsonDataBySheet['관리SHEET']) + ? jsonDataBySheet['관리SHEET'].slice(8) + : []; + // console.log('변환 후:', excelToManagementData(managementData)); + const filteredManagementData = filterEmptyRows(managementData); + setManagementTableData(filteredManagementData); + console.log('managementTableData', filteredManagementData); + + // 운영관리현황 점검결과 + const resultHeader = jsonDataBySheet['운영관리현황 점검결과']?.[2] || []; + const dynamicInspectionHeader = Object.entries(resultHeader) + .map(([key, value]) => ({ + id: key, + title: String(value).replace(/\r\n/g, '\n') + })); + setResultTableHeader(dynamicInspectionHeader); + console.log('resultTableHeader', dynamicInspectionHeader); + + const resultData = Array.isArray(jsonDataBySheet['운영관리현황 점검결과']) + ? jsonDataBySheet['운영관리현황 점검결과'].slice(3) + : []; + const filteredResultData = filterEmptyRows(resultData); + setResultTableData(filteredResultData); + console.log('resultTableData', filteredResultData); + } catch (error) { + console.error('파일 처리 중 오류 발생:', error); + alert('파일 처리 중 오류가 발생했습니다.'); + } finally { + setIsLoading(false); + } + } + + function filterEmptyRows(data: any[]) { + return data + .filter(row => { + return Object.entries(row).some(([key, value]) => { + const match = key.match(/^__EMPTY_(\d+)$/); + if (!match || parseInt(match[1] ?? '', 10) < 2) return false; + + return value !== undefined && + value !== null && + value !== '' && + value !== '-' && + String(value).trim() !== ''; + }); + }) + .map((row) => { + const processedRow = { ...row }; + const keys = Object.keys(processedRow); + + keys.forEach((key, keyIndex) => { + // 마지막 속성(비고)이 아닌 경우에만 빈 값을 '-'으로 변경 + if (keyIndex !== keys.length - 1) { + const value = processedRow[key]; + if (value === undefined || + value === null || + value === '' || + String(value).trim() === '') { + processedRow[key] = '-'; + } + } + }); + + return processedRow; + }); + }; + + // 특정 시트만 선택적으로 JSON으로 변환하는 함수 + function filePickedSelectedSheets(file: File, headerNum: number = 0, sheetNames: string[]): Promise> { + const reader = new FileReader(); + + return new Promise((resolve, reject) => { + reader.onload = function (e) { + const data = e.target?.result; + if (!data) { + console.error("Failed to read file: e.target.result is null"); + reject(new Error("Failed to read file")); + return; + } + + // Excel 파일 읽기 + const wb = XLSX.read(data, { type: 'binary', cellDates: true }); + const result: Record = {}; + + // 지정된 시트 이름만 찾아서 처리 + sheetNames.forEach(targetSheetName => { + // 대소문자 구분 없이 시트 이름 찾기 + const sheetName = wb.SheetNames.find(name => + name.toLowerCase() === targetSheetName.toLowerCase() + ); + + if (sheetName) { + const sheet = wb.Sheets[sheetName]; + if (sheet) { + console.log(`Found sheet: "${sheetName}"`); + const jsonData = XLSX.utils.sheet_to_json(sheet, { range: headerNum, raw: false }); + result[targetSheetName] = jsonData; + } + } else { + console.warn(`Sheet "${targetSheetName}" not found in workbook`); + result[targetSheetName] = []; + } + }); + + resolve(result); + }; + + reader.onerror = function () { + console.error("Error reading file"); + reject(new Error("Error reading file")); + }; + + // 파일 읽기 시작 + reader.readAsBinaryString(file); + }); + }; + + + return ( + <> + {/* 탭 영역 */} + ({ + value: tab.val, + label: tab.text + }))} + onValueChange={(value: string) => setActiveTab(value)} + /> + {/* 관리SHEET 탭 */} + {activeTab === 'management' && ( +
+
+ +
+ { }} + /> +
+
+
+ )} + {/* 운영관리현황 점검결과 탭 */} + {activeTab === 'Inspection results' && ( +
+
+ + { }} + /> +
+
+ )} + + ) +}; + +export default TableModal; \ No newline at end of file From c53a768c94439c6b88ee1859bc8e1c81d858157c Mon Sep 17 00:00:00 2001 From: swcho Date: Mon, 25 Aug 2025 13:47:50 +0900 Subject: [PATCH 13/31] =?UTF-8?q?refactor:=20-=20any=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=20=EC=A7=80=EC=A0=95=20-=20postMutiPart=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/sn/app/(with-base-layout)/ii/irsetting/page.tsx | 2 +- apps/sn/app/components/lib/api/index.ts | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) 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 a3c012b26..d9d49d4c7 100644 --- a/apps/sn/app/(with-base-layout)/ii/irsetting/page.tsx +++ b/apps/sn/app/(with-base-layout)/ii/irsetting/page.tsx @@ -54,7 +54,7 @@ const IrSetting = () => { const [swtrmtFcltNm, setSwtrmtFcltNm] = useState(''); // 하수처리시설명 상태 const [file, setFile] = useState(null); - const handleFileChange = (e) => { + const handleFileChange = (e: any) => { setFile(e.target.files[0]); }; diff --git a/apps/sn/app/components/lib/api/index.ts b/apps/sn/app/components/lib/api/index.ts index e5df594d7..f70b0f3c0 100644 --- a/apps/sn/app/components/lib/api/index.ts +++ b/apps/sn/app/components/lib/api/index.ts @@ -3,7 +3,7 @@ import axios from 'axios'; const BASE_URL = process.env.NEXT_PUBLIC_SEWERAGE_API_URL || ''; -export const getData = async (url: string, data?: object): Promise => { +export const getData = async (url: string): Promise => { const res = await fetch(url.startsWith('/') ? `${url}` : `${BASE_URL}/${url}`, { method: "GET", }); @@ -49,14 +49,8 @@ export const postData = async (url: string, data: object): Promise => { }; export const postMutiPart = async (url: string, data: FormData): Promise => { - const options: RequestInit = { - method: "POST", - body: data, - }; - //const res = await fetch(`${BASE_URL}/${url}`, options); const res = await axios.post(`${BASE_URL}/${url}`, data); - const resData = await res.json(); - return resData; + return res.data; }; export const putData = async (url: string, data: object): Promise => { From 3235524479ff8cf601a7c8504e09ac2a97dc433f Mon Sep 17 00:00:00 2001 From: swcho Date: Mon, 25 Aug 2025 14:10:16 +0900 Subject: [PATCH 14/31] =?UTF-8?q?feat:=20=EC=9A=B4=EC=98=81=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=ED=98=84=ED=99=A9=20=ED=85=8C=EC=9D=B4=EB=B8=94?= =?UTF-8?q?=EC=97=90=20=EC=9D=BC=EC=9E=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/sn/app/(with-base-layout)/oper/floodPre/tableModal.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/sn/app/(with-base-layout)/oper/floodPre/tableModal.tsx b/apps/sn/app/(with-base-layout)/oper/floodPre/tableModal.tsx index 547b46610..a1e87dd65 100644 --- a/apps/sn/app/(with-base-layout)/oper/floodPre/tableModal.tsx +++ b/apps/sn/app/(with-base-layout)/oper/floodPre/tableModal.tsx @@ -86,6 +86,10 @@ const TableModal: React.FC = ({ fileNm, atflId }) => { id: key, title: String(value).replace(/\r\n/g, '\n') })); + dynamicInspectionHeader.splice(1, 0, { + id: "__EMPTY_2", + title: '' + }); setResultTableHeader(dynamicInspectionHeader); console.log('resultTableHeader', dynamicInspectionHeader); From c8957ce0da3d14dc6df7ea0676c9c3ec22324ae5 Mon Sep 17 00:00:00 2001 From: leedj312 Date: Mon, 25 Aug 2025 14:31:16 +0900 Subject: [PATCH 15/31] =?UTF-8?q?=EC=8B=9C=EC=84=A4=20=ED=98=84=ED=99=A9?= =?UTF-8?q?=20=EB=B0=8F=20=EA=B1=B4=EC=B6=95=EB=AC=BC=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../splyPopup/searchBar/searchBar.tsx | 9 +- .../ruseFcltMng/fcltSttn/htdflSttn/page.tsx | 11 +- .../ruseFcltMng/fcltSttn/rainSttn/page.tsx | 18 +- .../ruseFcltMng/fcltSttn/rswtSttn/page.tsx | 15 +- apps/wr/app/store/common/code/basicCode.tsx | 31 +-- apps/wr/app/store/common/code/index.ts | 184 ++++++++---------- .../ruseFcltMng/fcltSttn/htdflSttn/index.tsx | 12 +- .../ruseFcltMng/fcltSttn/rainSttn/index.tsx | 14 +- .../ruseFcltMng/fcltSttn/rswtSttn/index.tsx | 13 +- 9 files changed, 152 insertions(+), 155 deletions(-) diff --git a/apps/wr/app/(popUp-layout)/splyPopup/searchBar/searchBar.tsx b/apps/wr/app/(popUp-layout)/splyPopup/searchBar/searchBar.tsx index ce5c6d1ae..0f5430771 100644 --- a/apps/wr/app/(popUp-layout)/splyPopup/searchBar/searchBar.tsx +++ b/apps/wr/app/(popUp-layout)/splyPopup/searchBar/searchBar.tsx @@ -5,7 +5,7 @@ import { type SelectDataType, } from "@common/business_components/ui"; import { Button, Label } from "@common/components/ui"; -import { useCallback, useEffect, useState } from "react"; +import { useCallback, useState } from "react"; import SearchInputText from "../SearchInputText/SearchInputText"; export function SearchBar({ @@ -15,7 +15,7 @@ export function SearchBar({ setHasuPk: (hasuPk: any) => void; onApply: () => void; }) { - const { map, code, codeInit, findRuseFclt } = useWrStore( + const { map, code, findRuseFclt } = useWrStore( (state) => state ); const [sidoValue, setSidoValue] = useState(""); @@ -24,10 +24,7 @@ export function SearchBar({ { text: "전체", val: "0" }, ]); - useEffect(() => { - //codeInit(); - }, [codeInit]); - + const initializeSigunData = useCallback( (sidoCd: string) => { if (sidoCd === "0") { diff --git a/apps/wr/app/(with-layout)/ruseFcltMng/fcltSttn/htdflSttn/page.tsx b/apps/wr/app/(with-layout)/ruseFcltMng/fcltSttn/htdflSttn/page.tsx index 46528bcf7..beaa71569 100644 --- a/apps/wr/app/(with-layout)/ruseFcltMng/fcltSttn/htdflSttn/page.tsx +++ b/apps/wr/app/(with-layout)/ruseFcltMng/fcltSttn/htdflSttn/page.tsx @@ -5,6 +5,7 @@ import { btnClass } from "@/app/store/common/code"; import type { customRainBdst } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; +import { htdflSttnSize } from "@/app/store/ruseFcltMng/fcltSttn/htdflSttn"; import { excelDownload, getCity, @@ -57,7 +58,7 @@ export default function HtdflSttn() { const [fcltNm, setFcltNm] = useState(""); useEffect(() => { - htdflSttnSearch(false, pageNation, "20", String(getConValue()), fcltNm, code.cityCd, code.sggCd); + htdflSttnSearch(false, pageNation, htdflSttnSize, String(getConValue()), fcltNm, code.cityCd, code.sggCd); isResetPage(false) }, [pageNation]); @@ -102,7 +103,7 @@ export default function HtdflSttn() { const excelClick = useCallback(() => { isDownloadTriggered.current = true; - htdflSttnSearch(true, 1, String(htdflSttnResCount), String(getConValue()), fcltNm, code.cityCd, code.sggCd); + htdflSttnSearch(true, 1, htdflSttnResCount, String(getConValue()), fcltNm, code.cityCd, code.sggCd); }, [htdflSttnSearch, objSearch, code.cityCd, code.sggCd, fcltNm, htdflSttnResCount]); useEffect(() => { @@ -124,7 +125,7 @@ export default function HtdflSttn() { useEffect(() => { if (!htdflSttn.isInit) { - initHtdfl(false, 1, "20", "0", fcltNm, code.cityCd, code.sggCd); + initHtdfl(false, 1, htdflSttnSize, "0", fcltNm, code.cityCd, code.sggCd); } }, [htdflSttn.isInit, initHtdfl]); @@ -185,7 +186,7 @@ export default function HtdflSttn() { From 2f4cfa0d78a63366dd1883931df25322a3827d6b Mon Sep 17 00:00:00 2001 From: jsyang Date: Tue, 26 Aug 2025 13:30:24 +0900 Subject: [PATCH 21/31] =?UTF-8?q?=EB=B0=94=EC=B0=A8=ED=8A=B8=20=ED=88=B4?= =?UTF-8?q?=ED=8C=81=20=EC=88=AB=EC=9E=90=EC=9D=98=20=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EC=B2=9C=EC=9E=90=EB=A6=AC=20=EC=89=BC=ED=8F=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business_components/src/ui/chart/BarChart.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/common/business_components/src/ui/chart/BarChart.tsx b/packages/common/business_components/src/ui/chart/BarChart.tsx index 79aa61c98..ec0647dff 100644 --- a/packages/common/business_components/src/ui/chart/BarChart.tsx +++ b/packages/common/business_components/src/ui/chart/BarChart.tsx @@ -19,6 +19,14 @@ const customStyles = { } as CSSProperties, }; +const fncNumberFormet = (value : string | number) => { + return String(value).includes('.')? + String(parseFloat(value.toString().replace(/,/g, ''))).split('.').map((part, index) => + index === 0 ? part.replace(/\B(?=(\d{3})+(?!\d))/g, ",") : part + ).join('.') + : String(value).replace(/\B(?=(\d{3})+(?!\d))/g, ","); +} + type BarChartProps = { chartConfig: ChartConfig | undefined; chartData: any[] | undefined; @@ -51,7 +59,7 @@ const CustomTooltip = ({
{/* 색상 박스 추가 (범례 색상과 동일) */}
- {` ${item.name} : ${item.value}`} + {` ${item.name} : ${fncNumberFormet(item.value)}`}
))}
From 8ea7427264b41cb9b5d5999e62e1a026778bb068 Mon Sep 17 00:00:00 2001 From: swcho Date: Tue, 26 Aug 2025 14:47:31 +0900 Subject: [PATCH 22/31] =?UTF-8?q?feat:=20=EC=9A=B4=EC=98=81=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EA=B2=B0=EA=B3=BC=20=EA=B4=80=EB=A1=9C=EB=8F=84=20?= =?UTF-8?q?=EC=A7=80=EB=8F=84=EC=97=90=EC=84=9C=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=EB=B3=B4=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?(=EC=9D=B4=EC=A0=84=20=EA=B2=80=EC=83=89=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=EA=B4=80=EB=A1=9C=20=EC=82=AD=EC=A0=9C=EB=90=98=EA=B2=8C?= =?UTF-8?q?=EB=81=94=20=EC=88=98=EC=A0=95=20=ED=95=84=EC=9A=94)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../map/searchModal/searchModal.tsx | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/apps/sn/app/(map-layout)/map/searchModal/searchModal.tsx b/apps/sn/app/(map-layout)/map/searchModal/searchModal.tsx index 2fb4e7cae..3ec23a850 100644 --- a/apps/sn/app/(map-layout)/map/searchModal/searchModal.tsx +++ b/apps/sn/app/(map-layout)/map/searchModal/searchModal.tsx @@ -1006,16 +1006,31 @@ const SearchModal: React.FC = ({ }; const viewMultipleFeature = async () => { - if (!(tableData.length === 0)) { - setIsLoading(true); + if (activeTab === 'basic') { + if (!(tableData.length === 0)) { + setIsLoading(true); - const row = tableData[0]; - const layerNm = row.lyrTypeNm; - const fids = tableData.map((item) => item.fid); - const core = GisApp.Module.layer as any; - await core.showMultipleSearchResultsFromGeoJSON(layerNm, fids); - setIsLoading(false); - onOpenChange(false); + const row = tableData[0]; + const layerNm = row.lyrTypeNm; + const fids = tableData.map((item) => item.fid); + const core = GisApp.Module.layer as any; + await core.showMultipleSearchResultsFromGeoJSON(layerNm, fids); + setIsLoading(false); + onOpenChange(false); + } + } else if (activeTab === 'operation') { + if (!(detailTableData.length === 0)) { + setIsLoading(true); + + const row = detailTableData[0]; + console.log('row', row); + const layerNm = row.lyrTypeNm; + const fids = detailTableData.map((item) => item.fid); + const core = GisApp.Module.layer as any; + await core.showMultipleSearchResultsFromGeoJSON(layerNm, fids); + setIsLoading(false); + onOpenChange(false); + } } } @@ -1159,7 +1174,10 @@ const SearchModal: React.FC = ({ resetPageNo={isResetDetailPage} resetSelection={isResetDetailSelection} headButton={ - +
+ + +
} />
From fa8e41909a91a659c2875979f550af8d97264b60 Mon Sep 17 00:00:00 2001 From: leedj312 Date: Tue, 26 Aug 2025 15:52:18 +0900 Subject: [PATCH 23/31] =?UTF-8?q?=EC=A3=BC=EC=86=8C=EA=B2=80=EC=83=89=20in?= =?UTF-8?q?put=20=EB=B0=95=EC=8A=A4=20=EA=B4=80=EB=A0=A8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/form/fcltReg/bdstReg/bdstReg.tsx | 114 ++++++++++-------- .../ui/form/fcltReg/rainReg/rainRegForm.tsx | 1 - 2 files changed, 66 insertions(+), 49 deletions(-) diff --git a/apps/wr/components/ui/form/fcltReg/bdstReg/bdstReg.tsx b/apps/wr/components/ui/form/fcltReg/bdstReg/bdstReg.tsx index ed3653f00..90ca4e0f5 100644 --- a/apps/wr/components/ui/form/fcltReg/bdstReg/bdstReg.tsx +++ b/apps/wr/components/ui/form/fcltReg/bdstReg/bdstReg.tsx @@ -9,6 +9,8 @@ import { SelectBox, type SelectDataType, } from "@common/business_components"; +import SearchInputAddress from "@common/business_components/ui/search_input_address"; +import type { addressType } from "@common/business_components/ui/search_input_address/findAddress"; import { Input } from "@common/components"; import { useEffect, useState } from "react"; @@ -16,49 +18,47 @@ export default function BdstReg({ form, type }: { form: any; type?: string }) { const { code } = useWrStore((state) => { return state; }); + const { userSiSggCd } = code; + const [useCityCd, setUserCityCd] = useState([]); + const [useSggCd, setUserSggCd] = useState([]); - const { userSiSggCd } = code - const [useCityCd, setUserCityCd] = useState([]) - const [useSggCd, setUserSggCd] = useState([]) - - // const [selectSgg, setSelectSgg] = useState(); - // const [objSearch, setObjSearch] = useState({ - // sgg: "", - // city: "", - // }); useEffect(() => { if (userSiSggCd.length === 2 && code.cityCd.length > 0) { - const city = code.cityCd.filter((item) => item.val === userSiSggCd) - const sgg = code.sggCd.filter((item) => item.val.slice(0, 2) === userSiSggCd) - sgg.unshift({ text: '전체', val: '0' }) - setUserCityCd(city) // Fix: Ensure city is of type SelectDataType[] - setUserSggCd(sgg) + const city = code.cityCd.filter((item) => item.val === userSiSggCd); + const sgg = code.sggCd.filter( + (item) => item.val.slice(0, 2) === userSiSggCd + ); + sgg.unshift({ text: "전체", val: "0" }); + setUserCityCd(city); // Fix: Ensure city is of type SelectDataType[] + setUserSggCd(sgg); if (city[0]?.val) { // 여기 중요 queueMicrotask(() => { - form.setValue("ctpvCd", Number(city[0]?.val), { shouldDirty: true, shouldTouch: true, shouldValidate: true }); + form.setValue("ctpvCd", Number(city[0]?.val), { + shouldDirty: true, + shouldTouch: true, + shouldValidate: true, + }); }); } - } else if (userSiSggCd.length === 5 && code.cityCd.length > 0 && code.sggCd.length > 0) { - const city = code.cityCd.filter((item) => item.val === userSiSggCd.slice(0, 2)) - const sgg = code.sggCd.filter((item) => item.val === userSiSggCd) - setUserSggCd(sgg) - setUserCityCd(city) - form.setValue('ctpvCd', Number(city[0]?.val)) - form.setValue('sggCd', Number(sgg[0]?.val)) - + } else if ( + userSiSggCd.length === 5 && + code.cityCd.length > 0 && + code.sggCd.length > 0 + ) { + const city = code.cityCd.filter( + (item) => item.val === userSiSggCd.slice(0, 2) + ); + const sgg = code.sggCd.filter((item) => item.val === userSiSggCd); + setUserSggCd(sgg); + setUserCityCd(city); + form.setValue("ctpvCd", Number(city[0]?.val)); + form.setValue("sggCd", Number(sgg[0]?.val)); } - }, [form, userSiSggCd, code.cityCd, code.sggCd]) + }, [form, userSiSggCd, code.cityCd, code.sggCd]); - - // useEffect(() => { - // const city = form.getValues("ctpvCd"); - // const sgg = form.getValues("sggCd"); - // setObjSearch({ city: city, sgg: sgg }); - // }, [selectSgg]); - useEffect(() => { const subscription = form.form?.watch((value: any) => { console.log("vale", value); @@ -67,15 +67,16 @@ export default function BdstReg({ form, type }: { form: any; type?: string }) { return () => subscription?.unsubscribe(); }, [form.form]); - - useEffect(() => { - console.log('form.formState ', form.watch("archArea")) - }, [form.formState]) + console.log("form.formState ", form.watch("archArea")); + }, [form.formState]); return ( <> -

{type !== "HTB" ? "건축물 기본 정보" : '시설 기본 정보'}

+

+ {" "} + {type !== "HTB" ? "건축물 기본 정보" : "시설 기본 정보"} +

{ field.onChange(Number(val)); }} - value={typeof field.value !== "undefined" ? field.value : useCityCd[0]?.val} + value={ + typeof field.value !== "undefined" + ? field.value + : useCityCd[0]?.val + } /> )} @@ -124,15 +129,19 @@ export default function BdstReg({ form, type }: { form: any; type?: string }) { control={form.control} name="bdstNm" render={({ field }) => ( - + { - field.onChange(e.target.value) + field.onChange(e.target.value); }} - value={field.value || ''} + value={field.value || ""} maxLength={txtSize} /> @@ -144,8 +153,8 @@ export default function BdstReg({ form, type }: { form: any; type?: string }) { control={form.control} name="daddr" render={({ field }) => ( - - + {/* + /> */} +
+ { + console.log("rtnData", rtnData); + field.onChange(rtnData.roadAddrPart1); + }} + > +
)} /> @@ -165,7 +183,7 @@ export default function BdstReg({ form, type }: { form: any; type?: string }) { control={form.control} name="frstArchPrmsnDt" render={({ field }) => ( - + @@ -218,9 +236,9 @@ export default function BdstReg({ form, type }: { form: any; type?: string }) { placeholder="면적을 입력하세요" type="text" onChange={(e) => { - field.onChange(e.target.value) + field.onChange(e.target.value); }} - value={field.value || ''} + value={field.value || ""} maxLength={numSize} /> diff --git a/apps/wr/components/ui/form/fcltReg/rainReg/rainRegForm.tsx b/apps/wr/components/ui/form/fcltReg/rainReg/rainRegForm.tsx index 5083e24fc..09acc46e8 100644 --- a/apps/wr/components/ui/form/fcltReg/rainReg/rainRegForm.tsx +++ b/apps/wr/components/ui/form/fcltReg/rainReg/rainRegForm.tsx @@ -135,7 +135,6 @@ export default function RainRegForm({ toast.error("시도/시군구 코드를 선택해야합니다."); return; } - const handleConfirm = async () => { rainBdstReg(values, data); if (setIsModal) setIsModal(false); From 632f1b0fd91416f4f340be1ab73b2654d0e4fe15 Mon Sep 17 00:00:00 2001 From: leedj312 Date: Tue, 26 Aug 2025 15:54:25 +0900 Subject: [PATCH 24/31] =?UTF-8?q?=EC=A3=BC=EC=86=8C=EA=B2=80=EC=83=89=20ap?= =?UTF-8?q?i=20=EB=B0=8F=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(=EC=9D=B8=ED=84=B0=EB=84=B7=EC=9A=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business_components/src/ui/index.ts | 1 + .../ui/search_input_address/findAddress.ts | 86 ++++++++++++++ .../src/ui/search_input_address/index.tsx | 108 ++++++++++++++++++ 3 files changed, 195 insertions(+) create mode 100644 packages/common/business_components/src/ui/search_input_address/findAddress.ts create mode 100644 packages/common/business_components/src/ui/search_input_address/index.tsx diff --git a/packages/common/business_components/src/ui/index.ts b/packages/common/business_components/src/ui/index.ts index eab3a7eab..8604f80d5 100644 --- a/packages/common/business_components/src/ui/index.ts +++ b/packages/common/business_components/src/ui/index.ts @@ -14,6 +14,7 @@ export * from "./search_form_left"; export * from "./search_form_right"; export * from "./search_input"; export * from "./search_input_select"; +export * from "./search_input_address"; export * from "./select"; export * from "./tab"; export * from "./table"; diff --git a/packages/common/business_components/src/ui/search_input_address/findAddress.ts b/packages/common/business_components/src/ui/search_input_address/findAddress.ts new file mode 100644 index 000000000..f56ab2370 --- /dev/null +++ b/packages/common/business_components/src/ui/search_input_address/findAddress.ts @@ -0,0 +1,86 @@ +const addresssKey = 'devU01TX0FVVEgyMDI1MDgyNTEwMzkwNDExNjEwNTM='; //인증키 만료일은 2025-11-23 + +/** + * 주소 API 응답 타입 + * https://business.juso.go.kr/addrlink/main.do 해당 사이트 참조 + */ +export type AddressApiResponse ={ + results: { + common: { + errorMessage: string; + countPerPage: string; + totalCount: string; + errorCode: string; + currentPage: string; + }; + juso: addressType[]; + }; + } + + export type addressType ={ + detBdNmList: string; + engAddr: string; + rn: string; + emdNm: string; + zipNo: string; + roadAddrPart2: string; + emdNo: string; + sggNm: string; + jibunAddr: string; + siNm: string; + roadAddrPart1: string; + bdNm: string; + admCd: string; + udrtYn: string; + lnbrMnnm: string; + roadAddr: string; + lnbrSlno: string; + buldMnnm: string; + bdKdcd: string; + liNm: string; + rnMgtSn: string; + mtYn: string; + bdMgtSn: string; + buldSlno: string; + } + + + + + + /** + * 주소에 따른 검색 + * @param search : 검색어 + * @returns addressType[] 주소 배열 + */ +export const findAddress = async (search: string) => { + if (!search) { + return []; + } + const params = new URLSearchParams({ + currentPage: "1", // 원하는 페이지 + countPerPage: "5", // 페이지당 결과 수 + keyword: search, // 검색어(주소) + confmKey: addresssKey, // 인증키 인터넷용 패쇄망용은 따로 발급 필요 즉 middleware에서 치환해서 사용해야할듯 + resultType: "json", // 결과 형식 기본은 xml + }); + const url = `https://business.juso.go.kr/addrlink/addrLinkApi.do?${params.toString()}`; + try { + const response = await fetch(url); + if (!response.ok) { + throw new Error('Network response was not ok'); + } + const data = await response.json(); + if (data.results && data.results.juso) { + return data.results.juso as addressType[]; + } else { + return []; + } + } catch (error) { + console.error('Error fetching address data:', error); + return []; + } + +} + + diff --git a/packages/common/business_components/src/ui/search_input_address/index.tsx b/packages/common/business_components/src/ui/search_input_address/index.tsx new file mode 100644 index 000000000..bacd767e4 --- /dev/null +++ b/packages/common/business_components/src/ui/search_input_address/index.tsx @@ -0,0 +1,108 @@ +import { Input } from "@common/components/ui"; +import React, { useCallback, useEffect, useRef, useState } from "react"; +import { findAddress, type addressType } from "./findAddress"; + +type thisProps = { + initValue: string | undefined; + setRtnData: (rtnData: addressType) => void; +}; + +/** + * + * @param initValue : 초기값 ? + * @returns setRtnData => 선택된 주소 데이터 반환 + */ +export default function SearchInputAddress({ + initValue = undefined, + setRtnData = () => {}, +}: thisProps) { + + const [isOpen, setIsOpen] = useState(false); + const [textValue, setTextValue] = useState(initValue || ""); + const [searchList, setSearchList] = useState([]); + + + const wrapperRef = useRef(null); + const handleInputChange = useCallback( + (e: React.ChangeEvent) => { + const value = e.target.value; + setTextValue(value); + findAddress(value).then((data) => { + setSearchList(data); + }) + if (value) { + setIsOpen(true); + } else { + setIsOpen(false); + } + }, + [setSearchList] + ); + + const handleSuggestionClick = useCallback( + (roadAddrPart1: string) => { + setTextValue(roadAddrPart1); + setIsOpen(false); + setRtnData(searchList?.find((item) => item.roadAddrPart1 === roadAddrPart1) || ({} as addressType)); + }, + [searchList, setRtnData] + ); + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if ( + wrapperRef.current && + !wrapperRef.current.contains(event.target as Node) + ) { + setIsOpen(false); + } + }; + + document.addEventListener("mousedown", handleClickOutside); + return () => { + document.removeEventListener("mousedown", handleClickOutside); + }; + }, []); + + return ( +
+ setIsOpen(true)} */ + className="w-full h-[3.2rem] !text-xl pl-3 text-gray-600 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500" + placeholder={`주소를 입력하세요`} + /> + {isOpen && ( +
+
+ {searchList && searchList.length > 0 ? ( + searchList.map((item: addressType, index: number) => ( +
handleSuggestionClick(item.roadAddrPart1)} + role="button" + tabIndex={0} + onKeyDown={(e) => { + if (e.key === "Enter" || e.key === " ") { + handleSuggestionClick(item.roadAddrPart1); + } + }} + > + {item.zipNo}  + {item.roadAddrPart1} +
+ )) + ) : ( +
+ 검색 결과가 없습니다. +
+ )} +
+
+ )} +
+ ); +} From aeaf507c47713787e7a476560c08a409c601bf8f Mon Sep 17 00:00:00 2001 From: jsyang Date: Tue, 26 Aug 2025 17:39:07 +0900 Subject: [PATCH 25/31] =?UTF-8?q?=EC=B0=A8=ED=8A=B8property=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(setXAxisYearTick=20-=20=EB=82=A0=EC=A7=9C=20x?= =?UTF-8?q?=EC=B6=95=EC=9D=BC=EA=B2=BD=EC=9A=B0=20(=EB=85=84=EB=8F=84-?= =?UTF-8?q?=EC=9B=94)=EB=B3=84=EB=A1=9C=20=EB=A7=8C=EB=93=A4=EC=96=B4?= =?UTF-8?q?=EC=A3=BC=EB=8A=94=20=EC=86=8D=EC=84=B1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/ui/chart/LineChart.tsx | 58 ++++++++++++++----- .../src/ui/chart/index.tsx | 3 +- 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/packages/common/business_components/src/ui/chart/LineChart.tsx b/packages/common/business_components/src/ui/chart/LineChart.tsx index 23570912d..63851cbea 100644 --- a/packages/common/business_components/src/ui/chart/LineChart.tsx +++ b/packages/common/business_components/src/ui/chart/LineChart.tsx @@ -6,6 +6,7 @@ import { ChartContainer, type ChartConfig } from "./lib/chart"; +import { get } from "http"; type LineChartProps = { chartConfig: ChartConfig | undefined; @@ -15,6 +16,7 @@ type LineChartProps = { graphSize?: number; yFieldText?: string; showLegend?: boolean; + setXAxisYearTick?: boolean; } /** 차트 기본 스타일 */ @@ -141,7 +143,8 @@ export default function Linechart({ chartClassName = 'w-full h-full', graphSize = 40, yFieldText, - showLegend = true + showLegend = true, + setXAxisYearTick = false, }: LineChartProps) { if (!chartData || Object.keys(chartData).length === 0) { return
데이터가 없습니다.
; @@ -164,18 +167,24 @@ export default function Linechart({ return acc; }, []); - // 데이터의 최대값 계산 - const getMaxValue = (data: ChartDataType): number => { - return Math.max(...Object.values(data).flatMap(dataset => - dataset.map(entry => { - const val = parseFloat(entry.val); - return isNaN(val) ? 0 : val; - }) - )); - }; - - const lineMaxValue = getMaxValue(chartData); - + const getTicks = (data : any []) => { + const monthSet = new Set(); + const rtnData : string[] = []; + for(const item of data){ + const month = String(item.label).slice(0,7); + if(!monthSet.has(month)){ + monthSet.add(month); + rtnData.push(item.label); + } + } + return rtnData; + } + + let monthTicks : string[] = []; + if(setXAxisYearTick){ + monthTicks = getTicks(mergedData); + } + return (
{chartTitle && chartTitle !== "" && chartTitle !== "undefined" ? ( @@ -192,8 +201,27 @@ export default function Linechart({ margin={{ top: 5, right: 30, left: 20, bottom: 5 }} > - - value.toLocaleString()} tickCount={6} orientation="left" label={{ value: yFieldText, className:"text-[12px] font-bold", angle: -90, position: 'insideLeft' }} /> + + {setXAxisYearTick ? + value.slice(0,7)} + /> : + + } + + } /> {showLegend && } {Object.keys(chartData).map((key) => { diff --git a/packages/common/business_components/src/ui/chart/index.tsx b/packages/common/business_components/src/ui/chart/index.tsx index ee308e378..a6e1ff245 100644 --- a/packages/common/business_components/src/ui/chart/index.tsx +++ b/packages/common/business_components/src/ui/chart/index.tsx @@ -56,6 +56,7 @@ type MainChartProps = { yFieldText? : string | undefined; yFieldText2? : string | undefined; showLegend? : boolean; + setXAxisYearTick ?: boolean; } function MainChart(props: MainChartProps) { @@ -65,7 +66,7 @@ function MainChart(props: MainChartProps) { ); } else if( props.chartForm == CHART_FORM.LINE ){ return ( - + ); } else if( props.chartForm == CHART_FORM.DN ){ return ( From b7133c9197a948475692634f3b9e20e2f7688a0c Mon Sep 17 00:00:00 2001 From: leedj312 Date: Tue, 26 Aug 2025 17:42:30 +0900 Subject: [PATCH 26/31] =?UTF-8?q?=EB=8C=80=EB=AF=BC=20=EC=88=98=EC=9A=94?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EB=93=B1=EB=A1=9D=EC=8B=9C=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=EC=82=AC=ED=95=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/sdmMng/sdmApplyList/page.tsx | 2 ++ .../pages/sdmMng/sdmInfoInsert/page.tsx | 16 +++++++++++++++- apps/dm/app/store/sdmMng/index.tsx | 11 ++++++----- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/apps/dm/app/(base-layout)/pages/sdmMng/sdmApplyList/page.tsx b/apps/dm/app/(base-layout)/pages/sdmMng/sdmApplyList/page.tsx index 9c2f6201e..8c681876c 100644 --- a/apps/dm/app/(base-layout)/pages/sdmMng/sdmApplyList/page.tsx +++ b/apps/dm/app/(base-layout)/pages/sdmMng/sdmApplyList/page.tsx @@ -60,6 +60,8 @@ export default function SdmApplyList({}: SdmApplyProps) { // 데이터 변환을 위한 별도의 useEffect useEffect(() => { if (sdmInfoStatusList.length > 0) { + + const newTransformedList = sdmInfoStatusList.map((item: DemandCompBizType) => ({ ...item, ctpvCd: selectSidoData.find(sido => sido.val === item.ctpvCd?.trim())?.text || '', diff --git a/apps/dm/app/(base-layout)/pages/sdmMng/sdmInfoInsert/page.tsx b/apps/dm/app/(base-layout)/pages/sdmMng/sdmInfoInsert/page.tsx index 8e5194bcd..b6a395974 100644 --- a/apps/dm/app/(base-layout)/pages/sdmMng/sdmInfoInsert/page.tsx +++ b/apps/dm/app/(base-layout)/pages/sdmMng/sdmInfoInsert/page.tsx @@ -54,11 +54,25 @@ function SdmInfoInsertContent() { useEffect(() => { const user = sessionStorage.getItem("user"); + + setDefaultValues((prev) => ({ ...prev, sdmNm: searchParams.get("dmdCoNm") || "", })); - sessionStorage.setItem("user", searchParams.get("dmdInfoId") || ""); + if(searchParams.get("dmdInfoId")){ + // const data = { + // dmdCoNm: searchParams.get("dmdCoNm") || '', + // ctpvCd: searchParams.get("ctpvCd") || '', + // sggCd: searchParams.get("sggCd") || '', + // dmdInfoId: searchParams.get("dmdInfoId") || '', + // daddr: searchParams.get("daddr") || '', + // telno: searchParams.get("telno") || '', + // } + + // sessionStorage.setItem("user", JSON.stringify(data || {})); + } + //sessionStorage.setItem("user", JSON.parse(user||'') || ""); setIsLogin(user || searchParams.get("dmdInfoId") ? true : false); }, [searchParams]); diff --git a/apps/dm/app/store/sdmMng/index.tsx b/apps/dm/app/store/sdmMng/index.tsx index 1b63c399d..35dd3d2a9 100644 --- a/apps/dm/app/store/sdmMng/index.tsx +++ b/apps/dm/app/store/sdmMng/index.tsx @@ -691,6 +691,7 @@ export const SdmReducer = (set: any): SdmActions => { // 수요정보 신청현황 getSdmInfoStatusList: async (dmdInfoId: string) => { const res = await getSdmInfoStatusList(dmdInfoId); + if(res.length === 0) { set((state: SdmType) => ({ Sdm: { @@ -700,15 +701,15 @@ export const SdmReducer = (set: any): SdmActions => { })) return; } - const sdmInfoStatusList : DemandCompBizType[] = []; + //const sdmInfoStatusList : DemandCompBizType[] = []; - res.demandInfo.map((el: DemandCompBizType, index: number) => { + const sdmInfoStatusList : DemandCompBizType[]= res.demandInfo.map((el: DemandCompBizType, index: number) => { const matchingInfo = res.demandMatchings.find((matching: DemandMatchings) => matching.dmdInfoSn === el.dmdInfoSn); const status = matchingInfo?.splyFcltFlg?.trim() === 'Sub' ? '검토' : matchingInfo?.splyFcltFlg?.trim() === 'matched' ? '매칭완료' : '신청'; const ruseUtztnFcltNm = matchingInfo?.ruseUtztnFcltNm ? matchingInfo.ruseUtztnFcltNm : ''; - const tmpData = { + return( { ...el, index: ++index, bzmnNo: res.bzmnNo, @@ -725,9 +726,9 @@ export const SdmReducer = (set: any): SdmActions => { status : status, splyCndtList: el.splyCndtList, ruseUtztnFcltNm: ruseUtztnFcltNm || '' - } - sdmInfoStatusList.push(tmpData); + }) }) + set((state: SdmType) => ({ Sdm: { ...state.Sdm, From dae440a4b4cee35b6d5e080cba893e61ab8fa9d1 Mon Sep 17 00:00:00 2001 From: leedj312 Date: Tue, 26 Aug 2025 17:46:51 +0900 Subject: [PATCH 27/31] =?UTF-8?q?=EC=88=98=EC=9A=94=EC=B2=98=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=EC=8B=9C=20=EC=A3=BC=EC=86=8C=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=EC=84=9C=EC=B9=98=EC=9D=B8=ED=92=8B=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/ui/sdmInsertForm/form.tsx | 586 ++++++++++-------- .../src/ui/search_input_address/index.tsx | 3 + 2 files changed, 337 insertions(+), 252 deletions(-) diff --git a/packages/common/business_components/src/ui/sdmInsertForm/form.tsx b/packages/common/business_components/src/ui/sdmInsertForm/form.tsx index 20a2050bc..5099db92e 100644 --- a/packages/common/business_components/src/ui/sdmInsertForm/form.tsx +++ b/packages/common/business_components/src/ui/sdmInsertForm/form.tsx @@ -1,47 +1,48 @@ import { Input } from "@common/components"; import { AsYouType } from "libphonenumber-js"; -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useState } from "react"; import type { ControllerRenderProps, UseFormReturn } from "react-hook-form"; import { FormField } from "../form"; import { FormUi } from "../form_ui"; import { SelectBox } from "../select"; import { SdmSearchForm } from "./sdmNameBox"; +import SearchInputAddress from "../search_input_address"; +import type { addressType } from "../search_input_address/findAddress"; // 수요처 정보 export type DemandCompType = { - index : number | ''; - dmdInfoId : string | ''; - bzmnNo : string | ''; - dmdCoNm : string | ''; - daddr : string | ''; - telno : string | ''; - rgtr : string | ''; - useUsgCd : string | ''; - ctpvCd : string | ''; - sggCd : string | ''; - dmdAplyPswd : string | ''; - wntUntprc : number | ''; - dmndTmng : Date | ''; - dmndQty : number | ''; - grssClfg : number | ''; - tn : number | ''; - combResdch : number | ''; - tph : number | ''; - trbt : number | ''; - ph : number | ''; - blgcOxygDmndQnt : number | ''; - clIonQnt : number | ''; - smll : number | ''; - cdtnv : number | ''; - crmty : number | ''; - rmrk : string | ''; - reqDt : string | ''; -} - + index: number | ""; + dmdInfoId: string | ""; + bzmnNo: string | ""; + dmdCoNm: string | ""; + daddr: string | ""; + telno: string | ""; + rgtr: string | ""; + useUsgCd: string | ""; + ctpvCd: string | ""; + sggCd: string | ""; + dmdAplyPswd: string | ""; + wntUntprc: number | ""; + dmndTmng: Date | ""; + dmndQty: number | ""; + grssClfg: number | ""; + tn: number | ""; + combResdch: number | ""; + tph: number | ""; + trbt: number | ""; + ph: number | ""; + blgcOxygDmndQnt: number | ""; + clIonQnt: number | ""; + smll: number | ""; + cdtnv: number | ""; + crmty: number | ""; + rmrk: string | ""; + reqDt: string | ""; +}; type SelectDataType = { - text: string; - val: string; + text: string; + val: string; }; interface FormSchema { @@ -52,7 +53,7 @@ interface FormSchema { daddr: string; telno: string; bznmTotNo?: string; - rgtr?: string | ''; + rgtr?: string | ""; dmdAplyPswd?: string; dmdAplyPswdConfirm?: string; } @@ -65,38 +66,50 @@ interface SdmRegFormProps { dataList: DemandCompType[]; rtnValue: (searchText: string, pageCnt: number) => void; setIsDuplicate: (value: boolean) => void; - updateList?:DemandCompType - readOnly?:boolean + updateList?: DemandCompType; + readOnly?: boolean; } -type FieldComponent = (field: ControllerRenderProps) => JSX.Element; +type FieldComponent = ( + field: ControllerRenderProps, +) => JSX.Element; -export function SdmRegForm({ form, onCheckboxChange, selectSidoData, selectSigunData, dataList, rtnValue, setIsDuplicate ,updateList,readOnly}: SdmRegFormProps) { - const [sidoValue, setSidoValue] = useState(''); - const [sigunValue, setSigunValue] = useState(''); - const [filteredSigunData, setFilteredSigunData] = useState([{ text: "전체", val: '0' }]); +export function SdmRegForm({ + form, + onCheckboxChange, + selectSidoData, + selectSigunData, + dataList, + rtnValue, + setIsDuplicate, + updateList, + readOnly, +}: SdmRegFormProps) { + const [sidoValue, setSidoValue] = useState(""); + const [sigunValue, setSigunValue] = useState(""); + const [filteredSigunData, setFilteredSigunData] = useState([ + { text: "전체", val: "0" }, + ]); const [isBznmTotNoDisabled, setIsBznmTotNoDisabled] = useState(true); - const [orgBznmNo, setOrgBznmNo] = useState(''); - const [updateCoNm, setUpdateNm] = useState('') + const [orgBznmNo, setOrgBznmNo] = useState(""); + const [updateCoNm, setUpdateNm] = useState(""); - - - const formatPhoneNumber = (value:string) => { + const formatPhoneNumber = (value: string) => { const input = value; const formatter = new AsYouType("KR"); const formatted = formatter.input(input); - return formatted + return formatted; }; // 사업자등록번호 포맷팅 함수 (3-2-5 형식) const formatBusinessNumber = (value: string) => { // 숫자만 추출 const digitsOnly = value.replace(/\D/g, ""); - + // 10자리까지만 처리 const limitedDigits = digitsOnly.slice(0, 10); - + // 3-2-5 형식으로 포맷팅 if (limitedDigits.length <= 3) { return limitedDigits; @@ -107,136 +120,166 @@ export function SdmRegForm({ form, onCheckboxChange, selectSidoData, selectSigun } }; - - const initializeSigunData = useCallback((sidoCd: string) => { - if (sidoCd === '0') { - setSigunValue('0'); - setFilteredSigunData([{ text: "전체", val: '0' }]); - } else { - const newFilteredData = [ - { text: "전체", val: '0' }, - ...selectSigunData.filter((item: SelectDataType) => item.val.substring(0, 2) === sidoCd) - ]; - setSigunValue('0'); - setFilteredSigunData(newFilteredData); - } - }, [selectSigunData]); - - const onSelectValue = useCallback(( - val: string, - type: string, - field: ControllerRenderProps | undefined - ) => { - if(!updateList?.dmdInfoId) - switch (type) { - case "ctpvCd": - initializeSigunData(val); - setSidoValue(val); - field?.onChange(val); - form.setValue('dmdInfoId', ''); - form.setValue('bznmTotNo', ''); - break; - case "sggCd": - setSigunValue(val); - field?.onChange(val); - form.setValue('dmdInfoId', ''); - form.setValue('bznmTotNo', ''); - break; - } - }, [initializeSigunData, form,updateList]); - - const handleCheckboxChange = useCallback((checked: boolean) => { - setIsBznmTotNoDisabled(checked); - onCheckboxChange?.(checked); - }, [onCheckboxChange]); - - const setRtnValue = useCallback((searchText: string, pageCnt: number) => { - rtnValue(searchText, pageCnt); - }, [rtnValue]); - - const setRtnData = useCallback((item: DemandCompType) => { - const rtnCompData = item; - - form.setValue('dmdCoNm', rtnCompData?.dmdCoNm || ''); - form.setValue('dmdInfoId', rtnCompData?.dmdInfoId.substring(0,10) || ''); - form.setValue('bznmTotNo', rtnCompData?.dmdInfoId.substring(10,14)==='0000' ? '' : rtnCompData?.dmdInfoId.substring(10,14)); - - // 수요처 불러온 후 사업자번호를 바꿀경우를 대비함 - setOrgBznmNo(rtnCompData?.dmdInfoId); - const sidoCd = rtnCompData?.ctpvCd.trim() || ''; - setSidoValue(sidoCd); - form.setValue('ctpvCd', sidoCd); - initializeSigunData(sidoCd); - - setTimeout(() => { - const sigunCd = rtnCompData?.sggCd.trim() || ''; - setSigunValue(sigunCd); - form.setValue('sggCd', sigunCd); - }, 100); - - if(rtnCompData?.dmdInfoId.substring(10,14) === '0000') { - handleCheckboxChange(true); - } else { - handleCheckboxChange(false); - } - - form.setValue('daddr', rtnCompData?.daddr || ''); - form.setValue('telno', rtnCompData?.telno || ''); - - // 선택을 했을 때 중복 상태를 true로 설정 - setIsDuplicate(true); - }, [form, handleCheckboxChange, initializeSigunData, setIsDuplicate]); - - const setRtnText = useCallback((text: string) => { - form.setValue('dmdCoNm', text); - }, [form]); - - const bznNoChange = useCallback((e: React.ChangeEvent, noType: string, field?: ControllerRenderProps) => { - const value = e.target.value; - - if(noType === 'dmdInfoId') { - // 숫자만 추출하여 저장 (포맷팅 제거) - const digitsOnly = value.replace(/\D/g, ""); - - if(orgBznmNo.substring(0,10) === digitsOnly) { - setIsDuplicate(true); + const initializeSigunData = useCallback( + (sidoCd: string) => { + if (sidoCd === "0") { + setSigunValue("0"); + setFilteredSigunData([{ text: "전체", val: "0" }]); } else { - setIsDuplicate(false); + const newFilteredData = [ + { text: "전체", val: "0" }, + ...selectSigunData.filter( + (item: SelectDataType) => item.val.substring(0, 2) === sidoCd, + ), + ]; + setSigunValue("0"); + setFilteredSigunData(newFilteredData); } - field?.onChange(digitsOnly); - } else { - if(orgBznmNo.substring(10,14) === value) { - setIsDuplicate(true); - } else { - setIsDuplicate(false); - } - field?.onChange(value); - } - }, [orgBznmNo, setIsDuplicate]); + }, + [selectSigunData], + ); - - useEffect(() => { - form.setValue('rgtr', '2d4b151d-1828-41e0-91d9-4cd28ea1cc7e'); - - if(updateList?.dmdInfoId){ - form.reset(updateList) - if(updateList?.dmdInfoId.slice(10,14) !== '0000') { - handleCheckboxChange( false); - form.setValue('bznmTotNo', updateList?.dmdInfoId.slice(10,14)); - } else { - handleCheckboxChange( true); + const onSelectValue = useCallback( + ( + val: string, + type: string, + field: ControllerRenderProps | undefined, + ) => { + if (!updateList?.dmdInfoId) + switch (type) { + case "ctpvCd": + initializeSigunData(val); + setSidoValue(val); + field?.onChange(val); + form.setValue("dmdInfoId", ""); + form.setValue("bznmTotNo", ""); + break; + case "sggCd": + setSigunValue(val); + field?.onChange(val); + form.setValue("dmdInfoId", ""); + form.setValue("bznmTotNo", ""); + break; } - form.setValue('dmdInfoId', updateList?.dmdInfoId.slice(0,10)); - setUpdateNm(updateList?.dmdCoNm) - // setSigunValue(updateList?.sggCd) - }else{ - handleCheckboxChange( true); - } - }, [updateList,form]); + }, + [initializeSigunData, form, updateList], + ); + + const handleCheckboxChange = useCallback( + (checked: boolean) => { + setIsBznmTotNoDisabled(checked); + onCheckboxChange?.(checked); + }, + [onCheckboxChange], + ); + + const setRtnValue = useCallback( + (searchText: string, pageCnt: number) => { + rtnValue(searchText, pageCnt); + }, + [rtnValue], + ); + + const setRtnData = useCallback( + (item: DemandCompType) => { + const rtnCompData = item; + + form.setValue("dmdCoNm", rtnCompData?.dmdCoNm || ""); + form.setValue("dmdInfoId", rtnCompData?.dmdInfoId.substring(0, 10) || ""); + form.setValue( + "bznmTotNo", + rtnCompData?.dmdInfoId.substring(10, 14) === "0000" + ? "" + : rtnCompData?.dmdInfoId.substring(10, 14), + ); + + // 수요처 불러온 후 사업자번호를 바꿀경우를 대비함 + setOrgBznmNo(rtnCompData?.dmdInfoId); + const sidoCd = rtnCompData?.ctpvCd.trim() || ""; + setSidoValue(sidoCd); + form.setValue("ctpvCd", sidoCd); + initializeSigunData(sidoCd); + + setTimeout(() => { + const sigunCd = rtnCompData?.sggCd.trim() || ""; + setSigunValue(sigunCd); + form.setValue("sggCd", sigunCd); + }, 100); + + if (rtnCompData?.dmdInfoId.substring(10, 14) === "0000") { + handleCheckboxChange(true); + } else { + handleCheckboxChange(false); + } + + form.setValue("daddr", rtnCompData?.daddr || ""); + form.setValue("telno", rtnCompData?.telno || ""); + + // 선택을 했을 때 중복 상태를 true로 설정 + setIsDuplicate(true); + }, + [form, handleCheckboxChange, initializeSigunData, setIsDuplicate], + ); + + const setRtnText = useCallback( + (text: string) => { + form.setValue("dmdCoNm", text); + }, + [form], + ); + + const bznNoChange = useCallback( + ( + e: React.ChangeEvent, + noType: string, + field?: ControllerRenderProps, + ) => { + const value = e.target.value; + + if (noType === "dmdInfoId") { + // 숫자만 추출하여 저장 (포맷팅 제거) + const digitsOnly = value.replace(/\D/g, ""); + + if (orgBznmNo.substring(0, 10) === digitsOnly) { + setIsDuplicate(true); + } else { + setIsDuplicate(false); + } + field?.onChange(digitsOnly); + } else { + if (orgBznmNo.substring(10, 14) === value) { + setIsDuplicate(true); + } else { + setIsDuplicate(false); + } + field?.onChange(value); + } + }, + [orgBznmNo, setIsDuplicate], + ); useEffect(() => { - console.log( 'form.formState.errors ', form.formState.errors) - },[form.formState.errors]) + form.setValue("rgtr", "2d4b151d-1828-41e0-91d9-4cd28ea1cc7e"); + + if (updateList?.dmdInfoId) { + form.reset(updateList); + if (updateList?.dmdInfoId.slice(10, 14) !== "0000") { + handleCheckboxChange(false); + form.setValue("bznmTotNo", updateList?.dmdInfoId.slice(10, 14)); + } else { + handleCheckboxChange(true); + } + form.setValue("dmdInfoId", updateList?.dmdInfoId.slice(0, 10)); + setUpdateNm(updateList?.dmdCoNm); + // setSigunValue(updateList?.sggCd) + } else { + handleCheckboxChange(true); + } + }, [updateList, form]); + + useEffect(() => { + console.log("form.formState.errors ", form.formState.errors); + }, [form.formState.errors]); const formFields: Array<{ name: keyof FormSchema; @@ -246,53 +289,64 @@ export function SdmRegForm({ form, onCheckboxChange, selectSidoData, selectSigun { name: "ctpvCd", label: "시도", - component: (field) => ( + component: (field) => updateList?.dmdInfoId ? ( {field.onChange(e.target.value)} } - value={ selectSidoData.find(item => item.val === field.value?.trim() )?.text??''} - readOnly={!!updateList?.dmdInfoId} + onChange={(e) => { + field.onChange(e.target.value); + }} + value={ + selectSidoData.find((item) => item.val === field.value?.trim()) + ?.text ?? "" + } + readOnly={!!updateList?.dmdInfoId} /> ) : ( - onSelectValue(val.toString(), 'ctpvCd', field??'')} - className="" - value={sidoValue} - /> - ) - ) + + onSelectValue(val.toString(), "ctpvCd", field ?? "") + } + className="" + value={sidoValue} + /> + ), }, { name: "sggCd", label: "시군구", - component: (field) => ( + component: (field) => updateList?.dmdInfoId ? ( {field.onChange(e.target.value)} } - value={selectSigunData.find(item => item.val === field.value?.trim() )?.text??''} - readOnly={!!updateList?.dmdInfoId} + onChange={(e) => { + field.onChange(e.target.value); + }} + value={ + selectSigunData.find((item) => item.val === field.value?.trim()) + ?.text ?? "" + } + readOnly={!!updateList?.dmdInfoId} /> ) : ( - onSelectValue(val.toString(), 'sggCd', field)} - className="" - value={sigunValue} - /> - - ) - ) + + onSelectValue(val.toString(), "sggCd", field) + } + className="" + value={sigunValue} + /> + ), }, { name: "dmdCoNm", @@ -308,117 +362,138 @@ export function SdmRegForm({ form, onCheckboxChange, selectSidoData, selectSigun readOnly={readOnly} {...field} /> - ) + ), }, { name: "dmdInfoId", label: "사업자등록번호", component: (field) => ( - bznNoChange(e, 'dmdInfoId', field)} - value={formatBusinessNumber(field.value || '')} + onChange={(e) => bznNoChange(e, "dmdInfoId", field)} + value={formatBusinessNumber(field.value || "")} readOnly={!!updateList?.dmdInfoId} /> - ) + ), }, { name: "bznmTotNo", label: "", component: (field) => ( - - bznNoChange(e, 'bznmTotNo', field)} - // {...field} - value={ field.value} + onChange={(e) => bznNoChange(e, "bznmTotNo", field)} + // {...field} + value={field.value} readOnly={!!updateList?.dmdInfoId} /> - ) + ), }, { name: "daddr", label: "사업자주소", component: (field) => ( - + { + field.onChange(rtnData.roadAddrPart1); + console.log("rtnData ", rtnData); + }} /> - ) + ), }, { name: "telno", label: "전화번호", - component: (field) => - - { - const formattedValue = formatPhoneNumber(field.value??''); // 초기 렌더링 시에도 포맷 적용 + component: (field) => { + const formattedValue = formatPhoneNumber(field.value ?? ""); // 초기 렌더링 시에도 포맷 적용 return ( - { - const value = e.target.value.replace(/\D/g, ''); // 숫자만 저장 - field.onChange(value); - }} - /> - )} + { + const value = e.target.value.replace(/\D/g, ""); // 숫자만 저장 + field.onChange(value); + }} + /> + ); + }, }, - + { name: "dmdAplyPswd", label: "패스워드", component: (field) => ( - - ) + ), }, { name: "dmdAplyPswdConfirm", label: "패스워드확인", component: (field) => ( - - ) - } - ] + ), + }, + ]; return ( <> {formFields - .filter(({ name }) => !(updateList?.dmdInfoId && (name === "dmdAplyPswd" || name === "dmdAplyPswdConfirm"))) + .filter( + ({ name }) => + !( + updateList?.dmdInfoId && + (name === "dmdAplyPswd" || name === "dmdAplyPswdConfirm") + ), + ) .map(({ name, label, component }) => { const error = form.formState.errors[name]; const inputId = `${name}-input`; const errorId = `${name}-error`; - const isRequired = ["ctpvCd", "sggCd", "dmdCoNm", "dmdInfoId", "daddr", "telno", "dmdAplyPswd", "dmdAplyPswdConfirm"].includes(name); + const isRequired = [ + "ctpvCd", + "sggCd", + "dmdCoNm", + "dmdInfoId", + "daddr", + "telno", + "dmdAplyPswd", + "dmdAplyPswdConfirm", + ].includes(name); return ( (
-