From 7b8f76c78d5c765a2cf11eea947aab3f4e827fee Mon Sep 17 00:00:00 2001 From: YangJinSoo94 Date: Thu, 12 Jun 2025 09:35:27 +0900 Subject: [PATCH 01/12] =?UTF-8?q?-=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EB=AA=A8=EB=8B=AC=ED=99=94=20=EC=A7=84=ED=96=89=20-=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=EC=9D=B4=EB=82=98=20=EC=9D=B4?= =?UTF-8?q?=EC=A0=84=20=EC=88=98=EC=9A=94=EC=B2=98=EB=93=B1=EB=A1=9D=20?= =?UTF-8?q?=EC=9D=B4=ED=9B=84=20=EC=88=98=EC=9A=94=EC=B2=98=20=EC=84=B8?= =?UTF-8?q?=ED=8C=85=EC=99=84=EB=A3=8C(=EB=A1=9C=EA=B7=B8=EC=9D=B8=20>=20?= =?UTF-8?q?=EC=88=98=EC=9A=94=EC=B2=98=20=EB=93=B1=EB=A1=9D=20=ED=98=B9?= =?UTF-8?q?=EC=9D=80=20=EB=B9=88=EC=B9=B8)=20-=20=EC=88=98=EC=9A=94?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EB=93=B1=EB=A1=9D=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business_components/src/ui/form_ui/index.tsx | 2 +- .../src/ui/sdmInsertForm/form.tsx | 13 ++++++------- .../src/ui/sdmInsertForm/index.tsx | 2 -- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/packages/common/business_components/src/ui/form_ui/index.tsx b/packages/common/business_components/src/ui/form_ui/index.tsx index de4b37f61..8f0ce136a 100644 --- a/packages/common/business_components/src/ui/form_ui/index.tsx +++ b/packages/common/business_components/src/ui/form_ui/index.tsx @@ -39,7 +39,7 @@ const FormUi = React.forwardRef( checked={isChecked} onCheckedChange={handleCheckboxChange} /> - + {children} diff --git a/packages/common/business_components/src/ui/sdmInsertForm/form.tsx b/packages/common/business_components/src/ui/sdmInsertForm/form.tsx index c5c0ee0db..f5ff20e1d 100644 --- a/packages/common/business_components/src/ui/sdmInsertForm/form.tsx +++ b/packages/common/business_components/src/ui/sdmInsertForm/form.tsx @@ -124,7 +124,7 @@ export function SdmRegForm({ form, onCheckboxChange, selectSidoData, selectSigun form.setValue('dmdCoNm', text); }, [form]); - const bznNoChange = useCallback((e: React.ChangeEvent, noType: string) => { + const bznNoChange = useCallback((e: React.ChangeEvent, noType: string, field?: ControllerRenderProps) => { const value = e.target.value; if(noType === 'dmdInfoPk') { @@ -133,17 +133,16 @@ export function SdmRegForm({ form, onCheckboxChange, selectSidoData, selectSigun } else { setIsDuplicate(false); } - form.setValue('dmdInfoPk', value); + field?.onChange(value); } else { if(orgBznmNo.substring(10,14) === value) { setIsDuplicate(true); } else { setIsDuplicate(false); } - form.setValue('bznmTotNo', value); + field?.onChange(value); } - - }, [form, orgBznmNo, setIsDuplicate]); + }, [orgBznmNo, setIsDuplicate]); const formFields: Array<{ name: keyof FormSchema; @@ -202,7 +201,7 @@ export function SdmRegForm({ form, onCheckboxChange, selectSidoData, selectSigun type="text" className="!text-xl text-gray-600" {...field} - onChange={(e) => bznNoChange(e, 'dmdInfoPk')} + onChange={(e) => bznNoChange(e, 'dmdInfoPk', field)} /> ) }, @@ -221,7 +220,7 @@ export function SdmRegForm({ form, onCheckboxChange, selectSidoData, selectSigun className="!mt-5 !text-xl text-gray-600" disabled={isBznmTotNoDisabled} {...field} - onChange={(e) => bznNoChange(e, 'bznmTotNo')} + onChange={(e) => bznNoChange(e, 'bznmTotNo', field)} /> ) diff --git a/packages/common/business_components/src/ui/sdmInsertForm/index.tsx b/packages/common/business_components/src/ui/sdmInsertForm/index.tsx index 4b4a94648..767f3dd56 100644 --- a/packages/common/business_components/src/ui/sdmInsertForm/index.tsx +++ b/packages/common/business_components/src/ui/sdmInsertForm/index.tsx @@ -176,8 +176,6 @@ export default function SdmInsertForm({selectSidoData, selectSigunData, dataList telno: data.telno, }); - //router.push(`/pages/sdmMng/sdmInfoInsert?${queryParams.toString()}`); - toast.success('수요처가 성공적으로 등록되었습니다.'); } catch (error) { console.error('Error submitting form:', error); toast.error('수요처 등록에 실패했습니다.'); From 95f926a86db078b6f2f5b9563e8eb7bdce87747c Mon Sep 17 00:00:00 2001 From: leedj312 Date: Thu, 12 Jun 2025 10:54:08 +0900 Subject: [PATCH 02/12] =?UTF-8?q?=EB=AC=BC=EC=9E=AC=EC=9D=B4=EC=9A=A9=20?= =?UTF-8?q?=EC=88=98=EC=9A=94=EC=B2=98=EA=B4=80=EB=A6=AC=20=EC=9E=91?= =?UTF-8?q?=EC=97=85=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/matMng/matDmd/coReg/page.tsx | 84 ----------- apps/wr/app/matMng/matDmd/coSttn/page.tsx | 142 ++++++++++-------- .../app/ruseFcltMng/fcltReg/pbnstReg/page.tsx | 2 - apps/wr/app/store/common/code/index.ts | 8 + apps/wr/app/store/matDmd/coReg/index.tsx | 13 -- apps/wr/app/store/matDmd/coSttn/headList.tsx | 16 +- apps/wr/app/store/matDmd/coSttn/index.tsx | 52 ++++--- .../ruseFcltMng/fcltReg/pbnstReg/headList.tsx | 5 +- .../ruseFcltMng/fcltReg/pbnstReg/index.tsx | 20 +-- .../ruseFcltMng/fcltReg/pbnstReg/type.tsx | 5 +- apps/wr/components/lib/func/commom.tsx | 7 +- .../fcltReg/pbnstReg/buseReg/bugRegForm.tsx | 101 ++++++++----- .../fcltReg/pbnstReg/mngReg/mngRegForm.tsx | 43 ++---- .../components/ui/searchInput/searchInput.tsx | 4 +- .../pbnstReg/ruseMngTable/ruseMngTable.tsx | 5 +- 15 files changed, 216 insertions(+), 291 deletions(-) delete mode 100644 apps/wr/app/matMng/matDmd/coReg/page.tsx delete mode 100644 apps/wr/app/store/matDmd/coReg/index.tsx diff --git a/apps/wr/app/matMng/matDmd/coReg/page.tsx b/apps/wr/app/matMng/matDmd/coReg/page.tsx deleted file mode 100644 index b0f911449..000000000 --- a/apps/wr/app/matMng/matDmd/coReg/page.tsx +++ /dev/null @@ -1,84 +0,0 @@ -"use client"; -import { useForm } from "react-hook-form"; -import { zodResolver } from "@hookform/resolvers/zod"; -import * as z from "zod"; -import { - Form, - FormField, - FormUi, - ScrollArea, - SelectBox, -} from "@common/business_components/ui"; -import { Button } from "@common/components/ui"; -import { CoRegForm } from "@/components/ui/form/matDmd/coRegForm/component"; -import toast, { Toaster } from "react-hot-toast"; -import { ToastFormUi } from "@/components/ui/toast/toastFromUi"; - -const formSchema = z.object({ - ctpv: z.string(), - sgg: z.string(), - coNm: z.string().min(1).max(20), - bznmNo: z.string().min(1).min(9).max(12), - addr: z.string().min(1).min(6).max(20), - telNo: z.string().min(8).max(12), - -}); - -export default function MyForm() { - - - - const form = useForm>({ - resolver: zodResolver(formSchema), - defaultValues: { - coNm:'', - bznmNo:'', - addr:'', - telNo:'', - }, - }); - - function onSubmit(values: z.infer) { - try { - toast.dismiss(); - //ToastFormUi("수요신청 화면으로 이동하시겠습니까?", "수요처 등록 완료", "./dmdReg", "이동") - - } catch (error) { - console.error("Form submission error", error); - toast.error("수요처 등록이 실패하였습니다."); - } - } - - return ( - <> -
-

- 수요처 정보입력 -

-
- -
-
-
-
-
- - {form} - - - -
- -
-
-
- -
-
- - ); -} - diff --git a/apps/wr/app/matMng/matDmd/coSttn/page.tsx b/apps/wr/app/matMng/matDmd/coSttn/page.tsx index b7e6c6c8e..20f34ebac 100644 --- a/apps/wr/app/matMng/matDmd/coSttn/page.tsx +++ b/apps/wr/app/matMng/matDmd/coSttn/page.tsx @@ -2,11 +2,14 @@ import { useWrStore } from "@/app/store"; import { btnClass } from "@/app/store/common/code"; -import type { customCoSttnBdst } from "@/app/store/matDmd/coSttn"; -import { excelDownload, getCity, getCityOrSgg, tableData } from "@/components/lib/func/commom"; +import { + excelDownload, + getCity, + getCityOrSgg, + tableData, +} from "@/components/lib/func/commom"; import { ContentsDiv, - SearchBaseForm, SearchDiv, SearchFormLeft, SearchFormRight, @@ -15,58 +18,74 @@ import { Title, UiModal, UiTable, - type ReturnType, - type SelectDataType + type SelectDataType, } from "@common/business_components/ui"; import ListDiv from "@common/business_components/ui/list_div"; -import { Button, DatePicker, Label } from "@common/components/ui"; -import { useCallback, useEffect, useRef, useState } from "react"; -import SdmInsertForm, { type DemandCompType } from "@common/business_components/ui/sdmInsertForm"; +import { Button } from "@common/components/ui"; +import { useCallback, useEffect, useState } from "react"; +import SdmInsertForm, { + type DemandCompType, +} from "@common/business_components/ui/sdmInsertForm"; import type { objSearchType } from "@/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal"; - +import { Toaster } from "react-hot-toast"; +import { ToastFormUi } from "@/components/ui/toast/toastFromUi"; export default function CoSttn() { - const [bdstTable, setBdstTable] = useState(); - + const { + code, + coSttn, + coSttnInit, + coSttnSearch, + getDemandCompList, + regDemandCompany, + coSttnTxtSearch, + demandCompList, + } = useWrStore((state) => state); + const [bdstTable, setBdstTable] = useState(); const [pageNation, setPageNation] = useState(1); - const { code, coSttn, coSttnInit, coSttnSearch, getDemandCompList, regDemandCompany, demandCompList } = useWrStore((state) => state); const { coSttnRes } = coSttn; - const [isDmdModal, setIsDmdModal] = useState<{ isMoal: boolean, data: DemandCompType }>({ isMoal: false, data: {} as DemandCompType }) - const [fromDate, setFromDate] = useState(new Date()); - const [toDate, setToDate] = useState(new Date()); - const [selectSgg, setSelectSgg] = useState() - const [objSearch, setObjSearch] = useState({ sgg: "", city: "" }); - const ref = useRef({} as ReturnType); - const codeData = getCityOrSgg(ref); + const [isDmdModal, setIsDmdModal] = useState<{ + isMoal: boolean; + data: DemandCompType; + }>({ isMoal: false, data: {} as DemandCompType }); + const [selectSgg, setSelectSgg] = useState(); + const [objSearch, setObjSearch] = useState({ + sgg: "", + city: "", + }); + + const [seartchTxt, setSearchTxt] = useState(); + const [upadateData, setUpdateData] = useState(); const getSelCity = (val: string | number) => { const cityValue = String(val); // Ensure val is treated as a string const data = getCity(cityValue, code.sggCd); setSelectSgg(data); - setObjSearch({ city: cityValue, sgg: '' }); + setObjSearch({ city: cityValue, sgg: "" }); }; const getSgg = (val: string | number) => { - console.log(val); - setObjSearch({ ...objSearch, sgg: String(val) }) + setObjSearch({ ...objSearch, sgg: String(val) }); }; useEffect(() => { if (!coSttn.isInit) { - coSttnInit(codeData ?? "0"); + const con = objSearch.sgg ? objSearch.sgg : objSearch.city; + coSttnInit("1", "13", "45"); } - }, [coSttn.isInit, coSttnInit]); + }, [coSttn.isInit, coSttnInit, objSearch]); useEffect(() => { - if (coSttnRes.length > 0 && code.cityCd.length > 0) { + if (coSttnRes?.length > 0 && code.cityCd.length > 0) { const data = tableData(coSttnRes, { code }); - const chData = data - .map((item: any) => ({ - ...item - })) + const chData = data.map((item: any) => ({ + ...item, + })); // .filter((item: any) => item !== undefined); setBdstTable(chData); + } else if (coSttnRes.length == 0) { + setBdstTable([]); } }, [coSttnRes]); @@ -84,10 +103,20 @@ export default function CoSttn() { }, [coSttn.excelList]); const excelClick = useCallback(() => { - console.log("??") - coSttnSearch("마인드원", 1); - }, [coSttnSearch]); + const con = objSearch.sgg ? objSearch.sgg : objSearch.city; + if (con) coSttnSearch("1", "10000", String(con)); + }, [coSttnSearch, objSearch.city, objSearch.sgg]); + const searchClick = () => { + const con = objSearch.sgg ? objSearch.sgg : objSearch.city; + if (con) { + if (seartchTxt && seartchTxt?.length > 0) { + coSttnTxtSearch("1", "13", String(con), seartchTxt ?? ""); + } else { + coSttnSearch("1", "13", String(con)); + } + } + }; return ( <> @@ -111,42 +140,27 @@ export default function CoSttn() { selectArray={selectSgg || []} onSelectValue={getSgg} /> -
-
- -
- { if (date) setFromDate(date) }} /> - ~ - { if (date) setToDate(date) }} /> -
-
-
{ + setSearchTxt(e); }} />
- +
- */}
@@ -389,6 +391,7 @@ export function PbnstMngForm({ tableData={fcOpersField} headList={pbnst.pbnstMngUpHeadList} upHeadList={pbnst.pbnstMngNm} + code={mngMtdCode || []} onTableSet={(val) => { setFcOpresData(val); }} @@ -404,7 +407,7 @@ export function PbnstMngForm({ control={form.control} name="fcltCpct" render={({ field }) => ( - +
-
- ( - - { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - readOnly - /> - - )} - /> -
+
( - + void; - setRtnData: (rtnData: any[]) => void; + setRtnData: (rtnData: any) => void; searchList?: any[]; }; export default function SearchInputText({ @@ -42,7 +42,7 @@ export default function SearchInputText({ setTextValue(dmdCoNm); setValue(dmdCoNm); setIsOpen(false); - setRtnData(searchList || []); + setRtnData(searchList?.find((item) => item.dmdCoNm === dmdCoNm) || {}); }, [searchList, setRtnData, setValue] ); diff --git a/apps/wr/components/ui/table/pbnstReg/ruseMngTable/ruseMngTable.tsx b/apps/wr/components/ui/table/pbnstReg/ruseMngTable/ruseMngTable.tsx index 43a08e203..f76ed23bb 100644 --- a/apps/wr/components/ui/table/pbnstReg/ruseMngTable/ruseMngTable.tsx +++ b/apps/wr/components/ui/table/pbnstReg/ruseMngTable/ruseMngTable.tsx @@ -42,8 +42,7 @@ const RuseMngTable = React.forwardRef( }, [tableState,onTableSet]); - - + useEffect(() => { if(tableData) setTableState(tableData); @@ -92,7 +91,7 @@ const RuseMngTable = React.forwardRef( ) : head.type === "select" ? ( item.name === head.selectData)?.val ?? []} + selectArray={code?.find(item => item.name === head.selectData)?.val ?? []} value={ tableState[i][head.id] || "" } From 67ee89dc543f910993b8cb5a185aace82154c74f Mon Sep 17 00:00:00 2001 From: leedj312 Date: Thu, 12 Jun 2025 10:54:28 +0900 Subject: [PATCH 03/12] =?UTF-8?q?=EB=AC=BC=EC=9E=AC=EC=9D=B4=EC=9A=A9=20?= =?UTF-8?q?=EC=88=98=EC=9A=94=EC=B2=98=20=EB=93=B1=EB=A1=9D=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/page.tsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/wr/app/page.tsx b/apps/wr/app/page.tsx index eac339156..c9f6e3e37 100644 --- a/apps/wr/app/page.tsx +++ b/apps/wr/app/page.tsx @@ -109,11 +109,6 @@ export default function Home() {

수요처 관리

-
- -
-
+
From 11af1841f113ccdca272a6cfdeebc8992b03a36b Mon Sep 17 00:00:00 2001 From: leedj312 Date: Sun, 15 Jun 2025 21:31:26 +0900 Subject: [PATCH 11/12] =?UTF-8?q?=ED=95=98=EC=88=98=EC=9E=AC=EC=9D=B4?= =?UTF-8?q?=EC=9A=A9=20=EB=93=B1=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/matMng/coMng/coSttn/page.tsx | 3 +- .../app/ruseFcltMng/fcltReg/pbnstReg/page.tsx | 165 ++++++-- .../prfmncReg/pbnstPrfmncReg/page.tsx | 2 + .../prfmncSttn/pbnstPrfmncSttn/page.tsx | 7 +- apps/wr/app/store/common/searchCode/index.ts | 13 +- .../ruseFcltMng/fcltReg/pbnstReg/headList.tsx | 6 +- .../ruseFcltMng/fcltReg/pbnstReg/index.tsx | 42 +- .../ruseFcltMng/fcltReg/pbnstReg/type.tsx | 255 ++++++----- .../fcltReg/pbnstReg/buseReg/bugRegForm.tsx | 396 ++++++++++-------- .../fcltReg/pbnstReg/mngReg/mngRegForm.tsx | 321 +++++++------- .../mngRegFormDetail/mngRegFormDetail.tsx | 57 +-- .../fcOrgwtsRegModal/fcOrgwtsRegModal.tsx | 1 - .../fcltReg/pbnstRegModal/pbnstRegModal.tsx | 125 ++++-- .../components/ui/searchInput/searchInput.tsx | 4 +- .../pbnstReg/ruseMngTable/ruseMngTable.tsx | 103 ++--- .../ruseMngTableForm/ruseMngTableForm.tsx | 163 +++++++ 16 files changed, 1027 insertions(+), 636 deletions(-) create mode 100644 apps/wr/components/ui/table/pbnstReg/ruseMngTableForm/ruseMngTableForm.tsx diff --git a/apps/wr/app/matMng/coMng/coSttn/page.tsx b/apps/wr/app/matMng/coMng/coSttn/page.tsx index b664147f5..19c17f9c9 100644 --- a/apps/wr/app/matMng/coMng/coSttn/page.tsx +++ b/apps/wr/app/matMng/coMng/coSttn/page.tsx @@ -77,10 +77,9 @@ export default function CoSttn() { useEffect(() => { if (!coSttn.isInit) { - console.log('coSttn.isInit ', coSttn.isInit) coSttnInit("1", "13", "0"); } - }, [coSttn.isInit, coSttnInit, objSearch]); + }, [coSttn.isInit, coSttnInit]); useEffect(() => { if (coSttnRes?.length > 0 && code.cityCd.length > 0) { diff --git a/apps/wr/app/ruseFcltMng/fcltReg/pbnstReg/page.tsx b/apps/wr/app/ruseFcltMng/fcltReg/pbnstReg/page.tsx index c5b1629e6..3c489837d 100644 --- a/apps/wr/app/ruseFcltMng/fcltReg/pbnstReg/page.tsx +++ b/apps/wr/app/ruseFcltMng/fcltReg/pbnstReg/page.tsx @@ -12,20 +12,28 @@ import { import { Button } from "@common/components"; import { useWrStore } from "../../../store"; import { Tabs, TabsList, TabsTrigger, TabsContent } from "@common/components"; -import { useEffect, useState } from "react"; +import { useCallback, useEffect, useState } from "react"; import ListDiv from "@common/business_components/ui/list_div"; import { tableData } from "@/components/lib/func/commom"; import type { customPbnst, fcBizType, + PbnstRegArrrayType, pubHasuType, } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type"; +import { + pbnstRegZod, + pbnstRegArrayZod, + fcBizSchema, +} from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type"; import { PbnstMngForm } from "@/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegForm"; import { PbnstBuseForm } from "@/components/ui/form/fcltReg/pbnstReg/buseReg/bugRegForm"; import { PbnstRegModal } from "@/components/ui/modal/fcltReg/pbnstRegModal/pbnstRegModal"; -import { Toaster } from "react-hot-toast"; -import { ToastFormUi } from "@/components/ui/toast/toastFromUi"; +import toast, { Toaster } from "react-hot-toast"; import { writeRgtrAndMdfr } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg"; +import { useFieldArray, useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { z } from "zod"; export default function PublicReuseFaciltyInsert() { const { @@ -34,9 +42,9 @@ export default function PublicReuseFaciltyInsert() { searchFclts, pubHasuInit, pbnstRegClick, - getSwtrmtFcltNm, pbnstMngData, pbnstRuseFcltUpdate, + pubHasuSearch, pbnstRuseBizUpdate, } = useWrStore((state) => state); const { pubFacHeadList, pbnstHasuRes, pbnstRes } = pbnst; @@ -47,53 +55,69 @@ export default function PublicReuseFaciltyInsert() { data: pubHasuType; }>({ isModal: false, data: {} as pubHasuType }); + const [indexMng, setIndexMng] = useState(0); + const [indexBiz, setIndexBiz] = useState(0); const [searchTxt, setSearchTxt] = useState(); const [bdstTable, setbdstTable] = useState(); + const [selectRow, setSelectRow] = useState(); + // const form = useForm>({ + // resolver: zodResolver(pbnstRegArrayZod), + // defaultValues: pbnstRegArrayZod.parse([]), + // mode: "onChange", + // }); + const form = useForm<{ + items: z.infer[]; + }>({ + resolver: zodResolver(z.object({ items: pbnstRegArrayZod })), + defaultValues: { items: pbnstRegArrayZod.parse([]) }, + mode:"onChange" + }); + const { + fields: items, + append, + remove, + } = useFieldArray({ + control: form.control, + name: `items`, + }); useEffect(() => { if (!pbnst.isInit) { pubHasuInit("1", "11"); } }, [pbnst.isInit, pubHasuInit]); + const onSubmit = async (valuse: { items: PbnstRegArrrayType }) => { + const data = writeRgtrAndMdfr(valuse.items); + let bizs = [] as fcBizType[]; + data.forEach((fclt) => { + bizs = [...bizs, ...fclt.fcBizs]; + }); - const saveRuseData = async ()=>{ - const data = writeRgtrAndMdfr(pbnst.pbnstMngRegData) - let bizs =[] as fcBizType[] - data.forEach((fclt) =>{ - bizs = [ - ...bizs, - ...fclt.fcBizs - ] - }) + await pbnstRuseFcltUpdate(data); - - await pbnstRuseFcltUpdate(data) - - await pbnstRuseBizUpdate(bizs) - - } - + await pbnstRuseBizUpdate(bizs); + }; useEffect(() => { - if(code.sggCd.length){ - if(searchFclts){ + if (code.sggCd.length) { + if (searchFclts) { setbdstTable(tableData(searchFclts, { code })); - }else if (code.sggCd.length > 0 && pbnstHasuRes.length > 0) { + } else if (code.sggCd.length > 0 && pbnstHasuRes.length > 0) { setbdstTable(tableData(pbnstHasuRes, { code })); } } - }, [code, pbnstHasuRes,searchFclts]); + }, [code, pbnstHasuRes, searchFclts]); const cellClick = (val: number | undefined) => { if (val === undefined) return; const selectRow = pbnstHasuRes?.[val]; + setSelectRow(pbnstHasuRes?.[val]) if (selectRow) { - setIsRuseReg({ ...isRuseReg, data: selectRow }); + //setIsRuseReg({ ...isRuseReg, data: selectRow }); pbnstRegClick(selectRow); - } }; @@ -101,6 +125,51 @@ export default function PublicReuseFaciltyInsert() { setCurrentTab(value); }; + useEffect(() => { + if (pbnst.pbnstRes) { + form.reset({ items: pbnstRegArrayZod.parse(pbnst.pbnstRes) }); + } + }, [pbnst.pbnstRes]); + useEffect(() => { + if (indexMng) { + setIndexBiz(0); + } + }, [indexMng]); + + useEffect(() => { + console.log("form errors:", form.formState.errors); + }, [form.formState.errors]); + + const appendPbnstRuseFclt = useCallback(() => { + if (pbnstRes && pbnstRes.length > 0) { + const lastPbnst = pbnstRes[pbnstRes.length - 1]; + console.log('lastPbnst.swtrmtFcltFk ', lastPbnst) + if(lastPbnst){ + append( + pbnstRegZod.parse({ + pbnstRuseFcltPk: String(lastPbnst.pbnstRuseFcltPk) + String(pbnstRes.length + 1), + ruseUtztnFcltNm: "", + fcBizs: [fcBizSchema.parse({pbnstRuseFcltFk:String(lastPbnst.pbnstRuseFcltPk) + String(pbnstRes.length + 1),cycl:1})] as fcBizType[], + }) + ); + setIsRuseReg({ ...isRuseReg, isModal: true }) + } + } else { + if(selectRow){ + append( + pbnstRegZod.parse({ + pbnstRuseFcltPk: String(selectRow.bscFctCd)+'1', + ruseUtztnFcltNm: "", + regDt: null, + mdfcnDt: null, + fcBizs: [fcBizSchema.parse({pbnstRuseFcltFk:String(selectRow.bscFctCd)+'1',cycl:1})] as fcBizType[], + }) + ); + setIsRuseReg({ ...isRuseReg, isModal: true }) + } + } + },[pbnstRegZod,pbnstRes,append,selectRow]) + return ( <> @@ -123,8 +192,8 @@ export default function PublicReuseFaciltyInsert() { size={"sm"} onClick={(e) => { searchTxt && searchTxt?.length > 0 - ? getSwtrmtFcltNm(searchTxt) - : pubHasuInit("1", "11") + ? pubHasuSearch("1", "11", searchTxt) + : pubHasuInit("1", "11"); }} > 조회 @@ -134,12 +203,13 @@ export default function PublicReuseFaciltyInsert() { className="" onClick={() => { pbnstMngData([] as customPbnst[]); - isRuseReg.data.bscFctCd - ? setIsRuseReg({ ...isRuseReg, isModal: true }) - : ToastFormUi({ - body: "하수리시시설을 테이블을 선택하고 등록버튼을 눌러주세요", - title: "재이용시설 등록", - }); + if(!selectRow){ + toast.error("하수리시시설을 테이블을 선택하고 등록버튼을 눌러주세요") + return + }else{ + appendPbnstRuseFclt() + + } }} > 신규등록 @@ -177,15 +247,34 @@ export default function PublicReuseFaciltyInsert() { 차수별정보 - - + { + setIndexMng(index); + }} + indexMng={indexMng} + /> - + { + setIndexBiz(index); + }} + indexMng={indexMng} + indexBiz={indexBiz} + /> @@ -193,12 +282,14 @@ export default function PublicReuseFaciltyInsert() { } bodyClass="w-[68vw] max-w-none h-[90vh]" open={isRuseReg.isModal} onOpenChange={(open) => { + remove(form.getValues("items").length - 1) setIsRuseReg({ data: {} as pubHasuType, isModal: open }); }} /> diff --git a/apps/wr/app/ruseFcltMng/prfmncReg/pbnstPrfmncReg/page.tsx b/apps/wr/app/ruseFcltMng/prfmncReg/pbnstPrfmncReg/page.tsx index fed0338f0..46ec39658 100644 --- a/apps/wr/app/ruseFcltMng/prfmncReg/pbnstPrfmncReg/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncReg/pbnstPrfmncReg/page.tsx @@ -134,6 +134,8 @@ export default function prfmncPrfmncReg() { } const tableData = [...inUsageData, ...outUsageData, usageTotalObj]; setPbnstRuseFcltPk(prfmncRes[index].pbnstRuseFcltPk); + + console.log(' tableData ' ,tableData) setInputData(tableData); } else { setInputData([]); diff --git a/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx b/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx index cfeddb170..a8f6efc3f 100644 --- a/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx @@ -70,7 +70,7 @@ export default function PbnstPrfmncSttn() { const inSubtotal = subTotalObj; const outSubtotal = subTotalObj; - + console.log(' prfList ', prfList) const prfFilter = prfList?.filter((e) => e.ym.slice(0, 4) === year) if (prfList && prfFilter.length > 0) { prfList?.forEach((prfItem) => { @@ -191,7 +191,7 @@ export default function PbnstPrfmncSttn() { fill: element.fill }; return config; - }, {} as Record) satisfies ChartConfig; + }, {} as Record) satisfies ChartConfig; setChartConfig(newChartConfig); }, [chartData]); @@ -209,6 +209,7 @@ export default function PbnstPrfmncSttn() { if (rawData) { rawData.forEach((item) => { item.prfList.filter((e) => e.ym.slice(0, 4) === year) .forEach((element) => { + wshwtr += element.wshwtr; //세척수 coolUswtr += element.coolUswtr; //냉각수 cleanUswtr += element.cleanUswtr; //청소수 @@ -567,7 +568,7 @@ export default function PbnstPrfmncSttn() { { setSwtrmtFcltNm(e); }} /> diff --git a/apps/wr/app/store/common/searchCode/index.ts b/apps/wr/app/store/common/searchCode/index.ts index 83234c2e1..97d5faa76 100644 --- a/apps/wr/app/store/common/searchCode/index.ts +++ b/apps/wr/app/store/common/searchCode/index.ts @@ -5,7 +5,7 @@ import { putFectch, } from "@/components/lib/api"; import type { pubHasuType } from "../../ruseFcltMng/fcltReg/pbnstReg/type"; -import type { DemandCompType } from "@common/business_components/ui"; +import type { DemandCompType } from "@common/business_components/ui/sdmInsertForm/form"; export type comFcltState = { searchFclts: pubHasuType; demandCompList: DemandCompType[]; @@ -24,9 +24,9 @@ export const searchActions: (set: any) => comFcltActions = (set: any) => { getSwtrmtFcltNm: async (searchNm: string) => { const fcltNm = await getFetch( "common", - `/prcsFclt/info/1/20/${searchNm}` + `/prcsFclt/info/1/11/${searchNm}` ); - const fcltNmCd: pubHasuType[] = fcltNm.map((item: any) => ({ + const searchFclts: pubHasuType[] = fcltNm.map((item: any) => ({ bscFctCd: item.bscFctCd, sido: item.sido, gugun: item.gugun, @@ -36,7 +36,7 @@ export const searchActions: (set: any) => comFcltActions = (set: any) => { })); set((state: comFcltState) => ({ ...state, - searchFclts: fcltNmCd, + searchFclts: searchFclts, })); }, getDemandCompList: async (searchNm: string, cnt: number) => { @@ -44,9 +44,10 @@ export const searchActions: (set: any) => comFcltActions = (set: any) => { fetchType.WR, `/reuseFc/request/${searchNm}/${cnt}` ); + + console.log(coList); set((state: comFcltState) => { - state.demandCompList = coList; - return state; + return state.demandCompList = [...coList]; }); }, regDemandCompany: async (data: DemandCompType) => { diff --git a/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/headList.tsx b/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/headList.tsx index 5459c8a52..536114f3f 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/headList.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/headList.tsx @@ -19,14 +19,11 @@ export const pbnstMngUpHeadListExport: TableUpperProps[] = [ { id: "bgngDt", title: "시작일", - upSequnce: 1, type: "date", }, { id: "endDt", title: "종료일", - upName: "upChangeRe", - upSequnce: 2, type: "date", }, ]; @@ -72,6 +69,7 @@ export type formDetailType = { id: string; lable: string; type?: string; + option?:string }; export const wasteWaterFcltINfo: formDetailType[] = [ @@ -102,7 +100,7 @@ export const businessMoneyInfo: formDetailType[] = [ { id: "lcep", lable: "지방비", type: "number" }, { id: "cusrAlotm", lable: "민간투자비", type: "number" }, { id: "etc", lable: "기타" }, - { id: "totalMoney", lable: "합계", type: "number" }, + { id: "totalMoney", lable: "합계", type: "number" ,option:"readOnly" }, ]; export const businessSttnInfo: formDetailType[] = [ diff --git a/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/index.tsx index 89efe821b..9fde9c092 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/index.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/index.tsx @@ -68,6 +68,7 @@ type pubFacActions = { getpbnstInsertIndex: (data: pbnstInsertIndex) => void; pbnstRuseFcltUpdate: (ruseRes: customPbnst[]) => void; pbnstRuseBizUpdate: (ruseRes: fcBizType[]) => void; + pubHasuSearch :(page: string, sggOrCity: string , searchTxt:string) => void }; export type pubFacType = pubFacState & pubFacActions; @@ -78,14 +79,14 @@ export const pubFacStateExport: pubFacState = { pbnstMngUpHeadList: pbnstMngUpHeadList, pbnstMngNm: pbnstMngNm, pbnstOrgwtHeadList: pbnstOrgwtHeadList, - pbnstHasuRes: [], - pbnstResObj: null, // 초기값을 null로 변경 - pbnstRes: [], // 초기값을 null로 변경 - pbnstBizCycle: [{ text: "없음", val: "1" }], - selectLabel: selectLabel, pplInstlsHeadLisat: pplInstlsHeadLisat, pbnstDemandHeadList: pbnstDemandHeadList, fcOrgwtsHeadList: fcOrgwtsHeadList, + selectLabel: selectLabel, + pbnstResObj: null, // 초기값을 null로 변경 + pbnstHasuRes: [], + pbnstRes: [], // 초기값을 null로 변경 + pbnstBizCycle: [{ text: "없음", val: "1" }], pbnstMngRegData: [], pbnsUpdateIndex: {} as pbnstInsertIndex, dmdComList: [], @@ -97,11 +98,15 @@ const checkWrRegList = async () => { return wrRegList; }; -const hasuListFetch = async (page: string, sggOrCity: string) => { +const hasuListFetch = async (page: string, sggOrCity: string, searchTxt?:string) => { const checkWrRegListRes = await checkWrRegList(); +let url = `/prcsFclt/ruseInfo/${page ? page : 1}/10/A/${sggOrCity ? sggOrCity : "11"}/0/1/SW`; +if(searchTxt){ + url= url +`/${searchTxt}` +} const rainRes = await postFectch( - `/prcsFclt/ruseInfo/${page ? page : 1}/10/A/${sggOrCity ? sggOrCity : "11"}/0/1/SW`, + url, checkWrRegListRes, fetchType.COMMON ); @@ -143,12 +148,12 @@ export const writeRgtrAndMdfr = (data: customPbnst[]) => { }); return item; }); - pbnst.fcOpers = pbnst.fcOpers.map((oper) => { + pbnst.fcOpers = pbnst?.fcOpers?.map((oper) => { oper.rgtr = TEST_UUID; oper.mdfr = TEST_UUID; return oper; }); - pbnst.fcFiles = pbnst.fcFiles.map((file) => { + pbnst.fcFiles = pbnst.fcFiles?.map((file) => { file.rgtr = TEST_UUID; file.mdfr = TEST_UUID; return file; @@ -176,8 +181,22 @@ export const pubFacActionsExport: (set: any) => pubFacActions = (set: any) => { } catch (errorHasu) { console.log(errorHasu); } - }, + },pubHasuSearch : async(page: string, sggOrCity: string , searchTxt:string)=> { + try{ + const pbnstHasuRes = await hasuListFetch(page, sggOrCity,searchTxt); + return set((state: pubFacState) => ({ + ...state, + pbnst: { + ...state.pbnst, + pbnstHasuRes: pbnstHasuRes, + isInit: false, + }, + })); + } catch (errorHasu) { + console.log(errorHasu); + } + }, pbnstRegClick: async (pubHasuRes: pubHasuType) => { try { const pbnstRes = await initFetch(pubHasuRes.bscFctCd); @@ -213,10 +232,9 @@ export const pubFacActionsExport: (set: any) => pubFacActions = (set: any) => { pbnstInsert: async (pbnstRes: customPbnst) => { try { - console.log( ' pbnstRes ' , pbnstRes) const response = await postFectch( `/reuseFc/pubFc`, - JSON.stringify( writeRgtrAndMdfr([pbnstRes])) + JSON.stringify( pbnstRes) ); return set((state: pubFacState) => ({ diff --git a/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/type.tsx b/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/type.tsx index e78040f11..fb9515bcf 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/type.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/type.tsx @@ -58,67 +58,8 @@ export type PbnstDemandComType = { splyCpct: number | 0; splyFmYn:string|'Y' dmdInfoFk:string|'' - } - - -export type fcBizType = z.infer; -export type fcOrgwtType = z.infer; -export type ppInstlType = z.infer; - -export type operType = z.infer; -export type fcFileType = z.infer; - - -const pplInstlSchema = z.object({ - ruseFcltBizFk: z.number().nullish(), - choose:z.boolean().default(false), - pdmt: z.string().default(''), - ppMqlt: z.string().default(""), - cpct: z.number().default(0), -}); -const fcFileSchema = z.object({ - ruseFcltFk: z.number().nullish(), - fileTkn: z.string(), - filePath: z.string(), - fileKnd: z.string(), - regDt: z.date().default(new Date()).nullish(), - rgtr: z.string().nullish(), - mdfcnDt: z.date().default(new Date()).nullish(), - mdfr: z.string().nullish(), -}); - -export const fcOperSchema = z.object({ - pbnstRuseFcltOperInfoPk: z.number().nullish(), - pbnstRuseFcltFk: z.string().nullish(), - operMthd: z.string(), - rprtvBzenty: z.string(), - bgngDt: z.date().default(new Date()), - endDt: z.date().default(new Date()), - regDt: z.date().nullish(), - rgtr: z.string().default(""), - mdfcnDt: z.date().nullish(), - mdfr: z.string().default(""), - choose: z.boolean().default(false), -}); - -const fcOrgwtSchema = z.object({ - pbnstRuseFcltBizFk: z.string().nullish(), - swtrmtFcltFk: z.number().default(0), - orgwtWtritQnt: z.number(), - tmsYn: z.enum(["Y", "N"] ).default("N"), - dschgFmYn: z.enum(["Y", "N"] ).default("N"), - dtlPstnExpln: z.string().default(''), - regDt: z.date().nullish(), - rgtr: z.string().default(''), - mdfcnDt: z.date().nullish(), - mdfr: z.string().default(''), - choose: z.boolean().default(false), -}); - - - const pubHasuZod = z.object({ choose: z.boolean().default(false), bscFctCd: z.string(), @@ -130,97 +71,141 @@ const pubHasuZod = z.object({ addr:z.string().nullish() }); -const demandInfoList = z.object({ - -}) - export type pubHasuType = z.infer; +const zDate = z.preprocess((v) => (v ? new Date(v as string) : undefined), z.date()).nullish() ; +const zDateNullish = zDate.nullish(); +const zDateDefaultNow = zDate.default(new Date()); +const zNum = z.preprocess((v) => (v !== null && v !== undefined ? Number(v) : v), z.number()); +const zNumNullish = zNum.nullish(); +const zNumDefaultZero = zNum.default(0).nullish(); +const pplInstlSchema = z.object({ + ruseFcltBizFk: zNumNullish, + choose: z.boolean().default(false), + pdmt: z.string().default(''), + ppMqlt: z.string().default(""), + cpct: zNumDefaultZero, +}); + +const fcFileSchema = z.object({ + ruseFcltFk: z.string().nullish(), + fileTkn: z.string(), + filePath: z.string(), + fileKnd: z.string(), + regDt: zDateDefaultNow.nullish(), + rgtr: z.string().nullish(), + mdfcnDt: zDateDefaultNow.nullish(), + mdfr: z.string().nullish(), +}); + +export const fcOperSchema = z.object({ + pbnstRuseFcltOperInfoPk: zNumNullish, + pbnstRuseFcltFk: z.string().nullish(), + operMthd: z.string(), + rprtvBzenty: z.string(), + bgngDt: zDateDefaultNow, + endDt: zDateDefaultNow, + regDt: zDateNullish, + rgtr: z.string().default(""), + mdfcnDt: zDateNullish, + mdfr: z.string().default(""), + choose: z.boolean().default(false), +}); + +const fcOrgwtSchema = z.object({ + pbnstRuseFcltBizFk:zNumNullish, + swtrmtFcltFk: z.string().nullish(), + orgwtWtritQnt: zNum, + tmsYn: z.enum(["Y", "N"]).default("N"), + dschgFmYn: z.enum(["Y", "N"]).default("N"), + dtlPstnExpln: z.string().default(''), + regDt: zDateNullish, + rgtr: z.string().default(''), + mdfcnDt: zDateNullish, + mdfr: z.string().default(''), + choose: z.boolean().default(false), +}); const dmdColist = z.object({ - dmdInfoFk:z.string().default(''), + dmdInfoFk: z.string().default(''), dmdCoNm: z.string().default(''), daddr: z.string(), useUsgCd: z.string().default(""), - splyBgngDay: z.date().default(new Date()), - splyEndDay: z.date().default(new Date()), - splyCpct: z.number().default(0), + splyBgngDay: zDateDefaultNow, + splyEndDay: zDateDefaultNow, + splyCpct: zNumDefaultZero, splyFmYn: z.string().default('Y'), rgtr: z.string().nullish(), mdfr: z.string().nullish(), - pbnstRuseFcltBizPk: z.number(), + pbnstRuseFcltBizPk: zNumDefaultZero, pbnstRuseFcltFk: z.string().nullish(), - //telno:z.string().default('') }); - - - export const fcBizSchema = z.object({ - pbnstRuseFcltBizPk: z.number().nullish(), + pbnstRuseFcltBizPk: zNumNullish, pbnstRuseFcltFk: z.string().nullish(), superkey: z.string().default("").nullish(), - cycl: z.number().default(1), + cycl: zNum.default(1), seCd: z.string().default(""), bizMthdCd: z.string().default(""), - instlAprvSncnDt: z.date().default(new Date()), - bizCmcnDay: z.date().default(new Date()), - gvsbs: z.number().default(0), - lcep: z.number().default(0), - cusrAlotm: z.number().default(0), + instlAprvSncnDt: zDateDefaultNow, + bizCmcnDay: zDateDefaultNow, + gvsbs: zNumDefaultZero, + lcep: zNumDefaultZero, + cusrAlotm: zNumDefaultZero, etc: z.string().default(''), - totalMoney: z.number().default(0).nullish(), - rprcsFcltCpct: z.number().default(0), + totalMoney: zNumNullish.default(0), + rprcsFcltCpct: zNumDefaultZero, majorPrcsMsrcCd: z.string().default(""), addr: z.string().default(''), rprcsMthdCd: z.string().default(""), inoutYn: z.enum(["Y", "N"]).default("Y"), - mainSplyPumpCpct: z.number().nullish(), - erctWtrOcrnCpct: z.number().nullish(), + mainSplyPumpCpct: zNumNullish, + erctWtrOcrnCpct: zNumNullish, erctUswtrLinkSpt: z.string().nullish(), - erctUswtrFcltCpct: z.number().nullish(), + erctUswtrFcltCpct: zNumNullish, erctUswtrPrcsMeth: z.string().nullish(), erctUswtrPrcsMsrcCd: z.string().nullish(), - wwtEmsnFcltPrmsnYn: z.enum(["Y", "N"]).default("Y"), - tmsInstlYn: z.enum(["Y", "N"]).default("Y"), - pbnstDrngInflwExclYn: z.enum(["Y", "N"]).default("Y"), - bod: z.number().default(0), - grssClfg: z.number().default(0), - combResdch: z.number().default(0), - trbt: z.number().default(0), - clIonQnt: z.number().default(0), - smll: z.number().default(0), - crmty: z.number().default(0), - tph: z.number().default(0), - tn: z.number().default(0), - ph: z.number().default(0), - cdtnv: z.number().default(0), - designCst: z.number().nullish(), - cstrnSpvsCst: z.number().nullish(), - fcltSbsdCst: z.number().nullish(), - wstCst: z.number().nullish(), - cnstCmcnCst: z.number().nullish(), - mntrgEqpmntInstlCst: z.number().nullish(), - gisDbCst: z.number().nullish(), - elpwrMtrngCst: z.number().nullish(), - mchnCst: z.number().nullish(), - archCst: z.number().nullish(), - pplCst: z.number().nullish(), - ruseFcltCst: z.number().nullish(), - designCstClcln: z.number().nullish(), - cstrnSpvsCstClcln: z.number().nullish(), - fcltSbsdCstClcln: z.number().nullish(), - wstCstClcln: z.number().nullish(), - cnstCmcnCstClcln: z.number().nullish(), - mntrgEqpmntInstlCstClcln: z.number().default(0), - gisDbCstClcln: z.number().nullish(), - elpwrMtrngCstClcln: z.number().nullish(), - mchnCstClcln: z.number().nullish(), - archCstClcln: z.number().nullish(), - pplCstClcln: z.number().nullish(), - ruseFcltCstClcln: z.number().nullish(), + wwtEmsnFcltPrmsnYn: z.string().default("Y"), + tmsInstlYn: z.string().default("Y"), + pbnstDrngInflwExclYn: z.string().default("Y"), + bod: zNumDefaultZero, + grssClfg: zNumDefaultZero, + combResdch: zNumDefaultZero, + trbt: zNumDefaultZero, + clIonQnt: zNumDefaultZero, + smll: zNumDefaultZero, + crmty: zNumDefaultZero, + tph: zNumDefaultZero, + tn: zNumDefaultZero, + ph: zNumDefaultZero, + cdtnv: zNumDefaultZero, + designCst: zNumNullish, + cstrnSpvsCst: zNumNullish, + fcltSbsdCst: zNumNullish, + wstCst: zNumNullish, + cnstCmcnCst: zNumNullish, + mntrgEqpmntInstlCst: zNumNullish, + gisDbCst: zNumNullish, + elpwrMtrngCst: zNumNullish, + mchnCst: zNumNullish, + archCst: zNumNullish, + pplCst: zNumNullish, + ruseFcltCst: zNumNullish, + designCstClcln: zNumNullish, + cstrnSpvsCstClcln: zNumNullish, + fcltSbsdCstClcln: zNumNullish, + wstCstClcln: zNumNullish, + cnstCmcnCstClcln: zNumNullish, + mntrgEqpmntInstlCstClcln: zNumDefaultZero, + gisDbCstClcln: zNumNullish, + elpwrMtrngCstClcln: zNumNullish, + mchnCstClcln: zNumNullish, + archCstClcln: zNumNullish, + pplCstClcln: zNumNullish, + ruseFcltCstClcln: zNumNullish, fcOrgwts: z.array(fcOrgwtSchema).nullish(), pplInstls: z.array(pplInstlSchema).nullish(), fcDemands: z.array(dmdColist).default([]).nullish(), @@ -230,18 +215,30 @@ export const fcBizSchema = z.object({ mdfcnDt: z.string().nullish(), mdfr: z.string().nullish(), }); + export const pbnstRegZod = z.object({ pbnstRuseFcltPk: z.string().default(''), swtrmtFcltFk: z.string().default(""), ruseUtztnFcltNm: z.string().default(""), - fcltCpct: z.number().default(0), - ruseCpct: z.number().default(0), - splyExtraCpct: z.number().default(0), - regDt: z.date().default(new Date()), + fcltCpct: zNumDefaultZero, + ruseCpct: zNumDefaultZero, + splyExtraCpct: zNumDefaultZero, + regDt: zDateDefaultNow, rgtr: z.string().default("test"), - mdfcnDt: z.date().default(new Date()), + mdfcnDt: zDateDefaultNow, mdfr: z.string().default("test"), - fcFiles: z.array(fcFileSchema).default([]), + fcFiles: z.array(fcFileSchema).default([]).nullish(), fcBizs: z.array(fcBizSchema).default([]), - fcOpers: z.array(fcOperSchema).default([]), + fcOpers: z.array(fcOperSchema).default([]).nullish(), }); + +export const pbnstRegArrayZod = z.array(pbnstRegZod) + +export type PbnstRegArrrayType = z.infer + +export type fcBizType = z.infer; +export type fcOrgwtType = z.infer; +export type ppInstlType = z.infer; +export type operType = z.infer; +export type fcFileType = z.infer; + diff --git a/apps/wr/components/ui/form/fcltReg/pbnstReg/buseReg/bugRegForm.tsx b/apps/wr/components/ui/form/fcltReg/pbnstReg/buseReg/bugRegForm.tsx index f5a7a0530..645a2fa07 100644 --- a/apps/wr/components/ui/form/fcltReg/pbnstReg/buseReg/bugRegForm.tsx +++ b/apps/wr/components/ui/form/fcltReg/pbnstReg/buseReg/bugRegForm.tsx @@ -13,7 +13,7 @@ import { fcBizSchema, type customPbnst, type fcBizType, - type PbnstDemandComType, + type PbnstRegArrrayType, type ppInstlType, } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type"; import { selectClass } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; @@ -39,22 +39,29 @@ import { Input, Label, } from "@common/components"; -import { zodResolver } from "@hookform/resolvers/zod"; import { useEffect, useRef, useState } from "react"; -import { useFieldArray, useForm } from "react-hook-form"; +import { useFieldArray, useForm, type UseFormReturn } from "react-hook-form"; import MngRegFormDetail from "../mngReg/mngRegFormDetail/mngRegFormDetail"; import { safeDate } from "@/components/lib/func/commom"; import SearchInputText from "@/components/ui/searchInput/searchInput"; -import SdmInsertForm, { - type DemandCompType, -} from "@common/business_components/ui/sdmInsertForm"; +import SdmInsertForm from "@common/business_components/ui/sdmInsertForm"; +import type { DemandCompType } from "@common/business_components/ui/sdmInsertForm/form"; +import RuseMngTableForm from "@/components/ui/table/pbnstReg/ruseMngTableForm/ruseMngTableForm"; export function PbnstBuseForm({ formType, firstBizData, + indexMng = 0, + indexBiz = 0, + setIndexBiz, + form, }: { formType: string; firstBizData?: fcBizType[]; + form: UseFormReturn<{ items: PbnstRegArrrayType }>; + indexMng: number; + indexBiz: number; + setIndexBiz: (index: number) => void; }) { const ref = useRef(null); const { @@ -73,6 +80,13 @@ export function PbnstBuseForm({ const [ppiSelectList, setPpiSelectList] = useState<[{ name: string; val: SelectDataType[] }]>(); const [ppiYn, setPpiYn] = useState("Y"); + + const [selectBizCycle, setSelectBizCycle] = useState< + { + text: string; + val: number; + }[] + >([{ text: "없음", val: 0 }]); const [isFcOrgwts, setIsFcOrgwts] = useState(false); const [sumCpct, setSumCpct] = useState(0); const [getDmdList, setGetFmdList] = useState(0); @@ -81,56 +95,83 @@ export function PbnstBuseForm({ data: DemandCompType; }>({ isMoal: false, data: {} as DemandCompType }); - const form = useForm({ - resolver: zodResolver(fcBizSchema), - defaultValues: - formType === "reg" && - pbnst.pbnstMngRegData && - pbnst.pbnstMngRegData[0]?.fcBizs - ? (pbnst.pbnstMngRegData[0].fcBizs[0] ?? {}) - : formType === "update" && - typeof pbnst.pbnsUpdateIndex.biz === "number" && - pbnst.pbnsUpdateIndex.biz >= 0 && - pbnst.pbnstRes - ? pbnst.pbnstRes[pbnst.pbnsUpdateIndex.mng]?.fcBizs[ - pbnst.pbnsUpdateIndex.biz - ] - : fcBizSchema.parse({}), - mode: "onChange", - }); - // 2. Define a submit handler. - function onSubmit(values: fcBizType) { - // console.log(values); - } + useEffect(() => { + const total = + (form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.gvsbs`) ?? 0) + + (form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.lcep`) ?? 0) + + (form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.cusrAlotm`) ?? 0); + form.setValue(`items.${indexMng}.fcBizs.${indexBiz}.totalMoney`, total); + }, [ + form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.gvsbs`), + form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.lcep`), + form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.cusrAlotm`) + ]); + + // const form = useForm({ + // resolver: zodResolver(fcBizSchema), + // defaultValues: + // formType === "reg" && + // pbnst.pbnstMngRegData && + // pbnst.pbnstMngRegData[0]?.fcBizs + // ? (pbnst.pbnstMngRegData[0].fcBizs[0] ?? {}) + // : formType === "update" && + // typeof pbnst.pbnsUpdateIndex.biz === "number" && + // pbnst.pbnsUpdateIndex.biz >= 0 && + // pbnst.pbnstRes + // ? pbnst.pbnstRes[pbnst.pbnsUpdateIndex.mng]?.fcBizs[ + // pbnst.pbnsUpdateIndex.biz + // ] + // : fcBizSchema.parse({}), + // mode: "onChange", + // }); + + + useEffect(() => { + if (form) { + const cycleLength = form.getValues(`items.${indexMng}.fcBizs`).length; + setSelectBizCycle( + Array.from({ length: cycleLength }, (_, index) => ({ + text: `${index + 1}차`, // ✅ index + 1 + val: index, // 이건 그대로 유지 (value로는 0부터 시작) + })) + ); + } + }, [indexMng, form]); // 2. Define a submit handler. function addRuseFcltObj() { - const newItem = fcBizSchema.parse({}); + const formRuse = form.getValues(`items.${indexMng}`); + + const formBizs = form.getValues(`items.${indexMng}.fcBizs`); + const pbnstBizCycle = formBizs.length; + + // 🧩 새로운 fcBizs 기본 객체 생성 (필수값만 채우고 나머지는 default로) + const newItem = fcBizSchema.parse({ + cycl: pbnstBizCycle + 1, + pbnstRuseFcltFk: formRuse.pbnstRuseFcltPk, + fcOrgwts: undefined, + pplInstls: undefined, + fcDemands: undefined, + }); const index = pbnst.pbnsUpdateIndex.mng; - - let regData: fcBizType = {} as fcBizType; - if ( - pbnst.pbnstRes && - pbnst.pbnstRes[pbnst.pbnsUpdateIndex.mng] && - pbnst.pbnstRes[pbnst.pbnsUpdateIndex.mng]?.fcBizs - ) { - regData = { - pbnstRuseFcltFk: - String(pbnst.pbnstRes[0]?.swtrmtFcltFk) + - String(pbnst.pbnstRes.length + 1), - cycl: Number( - (pbnst.pbnstRes[pbnst.pbnsUpdateIndex.mng]?.fcBizs?.length || 0) + 1 - ), - } as fcBizType; - - const newPbnstRes = [...(pbnst.pbnstRes as customPbnst[])]; - newPbnstRes[index]?.fcBizs?.length && - newPbnstRes[index]?.fcBizs?.push(regData); - getBizCycle(newPbnstRes[index] as customPbnst); - appendRuseFclt(newPbnstRes); - } + appendBiz(newItem); + const cycleLength = form.getValues(`items.${indexMng}.fcBizs`).length; + setSelectBizCycle( + Array.from({ length: cycleLength }, (_, index) => ({ + text: `${index + 1}차`, // ✅ index + 1 + val: index, // 이건 그대로 유지 (value로는 0부터 시작) + })) + ); } + useEffect(() => { + console.log("form ", form.watch()); + }, [form.formState]); + + const { fields: fcBizs, append: appendBiz } = useFieldArray({ + control: form.control, + name: `items.${indexMng}.fcBizs`, + }); const { fields: fcDemands, @@ -138,78 +179,54 @@ export function PbnstBuseForm({ remove: removeDemand, } = useFieldArray({ control: form.control, - name: "fcDemands", + name: `items.${indexMng}.fcBizs.${indexBiz}.fcDemands`, }); const { fields: fcOrgwtFiled } = useFieldArray({ control: form.control, - name: "fcOrgwts", + name: `items.${indexMng}.fcBizs.${indexBiz}.fcOrgwts`, }); - + console.log(" fcOrgwtFiled ", fcOrgwtFiled); const { fields: pplInstls, - append, - remove, + append: appendPpl, + remove: removePpl, } = useFieldArray({ control: form.control, - name: "pplInstls", + name: `items.${indexMng}.fcBizs.${indexBiz}.pplInstls`, }); - // 등록할때 신규 값을 계속 가지고 있으려고 - useEffect(() => { - const formData = form.watch(); - - //console.log(" formData.fcDemands. ", formData.fcDemands); - formData.pplInstls = ref.current ? [...ref.current] : []; // ← form 내부 상태 기준으로 복사 - //formData.fcDemands = fcDemands; - //formData.fcOrgwts = fcOrgwtFiled; - console.log(" formData. ", formData); - if (formType === "reg") { - if ( - firstBizData && - firstBizData[0] && - (form.getValues("pbnstRuseFcltFk") === "" || - form.getValues("pbnstRuseFcltFk") === undefined) - ) { - form.setValue( - "pbnstRuseFcltFk", - String(firstBizData[0].pbnstRuseFcltFk) - ); - form.setValue("cycl", firstBizData[0].cycl); - } - pbnstBizData(formData as fcBizType); - } else if (formType === "update") { - pbnstBizData(formData as fcBizType); - } - }, [firstBizData, form.formState, formType, pbnst.pbnstRes]); - useEffect(() => { if (ppiYn === "N") { - form.setValue("pplInstls", []); + form.setValue(`items.${indexMng}.fcBizs.${indexBiz}.pplInstls`, []); } - }, [ppiYn]); + }, [ppiYn, indexMng, indexBiz]); useEffect(() => { console.log("pbnst. bug pbnstMngRegData ", pbnst.pbnstMngRegData); }, [pbnst.pbnstMngRegData]); const plusHist = () => { - const regData = { - ruseFcltBizFk: - ref.current?.[0]?.ruseFcltBizFk ?? form.getValues("pbnstRuseFcltBizPk"), - choose: false, - ppMqlt: "", - pdmt: "", - cpct: 0, - }; - const currentTableDataFromRef = ref.current ? [...ref.current] : []; - const newDataForRHF = [...currentTableDataFromRef, regData]; - form.setValue("pplInstls", newDataForRHF, { - shouldValidate: true, // 필요하다면 유효성 검사 실행 - shouldDirty: true, // 폼 상태를 dirty로 변경 - }); - const latestOpers = form.getValues("pplInstls"); - ref.current = [...latestOpers]; + if ( + form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.pbnstRuseFcltBizPk`) + ) { + appendPpl({ + ruseFcltBizFk: form.getValues( + `items.${indexMng}.fcBizs.${indexBiz}.pbnstRuseFcltBizPk` + ), + choose: false, + ppMqlt: "", + pdmt: "", + cpct: 0, + }); + } else { + appendPpl({ + choose: false, + ppMqlt: "", + pdmt: "", + cpct: 0, + }); + } }; const plusArray = () => { @@ -221,29 +238,31 @@ export function PbnstBuseForm({ splyEndDay: new Date(), splyCpct: 0, splyFmYn: "Y", - pbnstRuseFcltBizPk: form.getValues("pbnstRuseFcltBizPk"), - pbnstRuseFcltFk: form.getValues("pbnstRuseFcltFk") ?? "", + pbnstRuseFcltBizPk: form.getValues( + `items.${indexMng}.fcBizs.${indexBiz}.pbnstRuseFcltBizPk` + ), + pbnstRuseFcltFk: + form.getValues( + `items.${indexMng}.fcBizs.${indexBiz}.pbnstRuseFcltFk` + ) ?? "", dmdInfoFk: "", //telno: "", }); }; const removeSelected = () => { - if (!ref.current) return; - const selectedIdxs = ref.current + const nowPPl = form.getValues( + `items.${indexMng}.fcBizs.${indexBiz}.pplInstls` + ); + + if (!nowPPl) return; + + const selectedIdxs = nowPPl .map((item, idx) => (item.choose ? idx : -1)) .filter((idx) => idx !== -1); - selectedIdxs.reverse().forEach((idx) => remove(idx)); + selectedIdxs.reverse().forEach((idx) => removePpl(idx)); }; - useEffect(() => { - if (bizCycle && formType !== "reg") { - const index = Number(bizCycle) - 1; - form.reset(pbnst.pbnstResObj?.fcBizs[index]); - ref.current = pbnst.pbnstResObj?.fcBizs[index]?.pplInstls ?? []; - } - }, [bizCycle, pbnst.pbnstResObj, formType]); - useEffect(() => { const ppl = [] as { name: string; val: SelectDataType[] }[]; if (code.pplLenght) { @@ -259,10 +278,6 @@ export function PbnstBuseForm({ } }, [code]); - useEffect(() => { - console.log(" fcDemands ", fcDemands); - }, [fcDemands]); - useEffect(() => { console.log(" demandCompList ", demandCompList); }, [demandCompList]); @@ -270,6 +285,16 @@ export function PbnstBuseForm({ console.log("form errors:", form.formState.errors); }, [form.formState.errors]); + useEffect(() => { + const pplSum = form.watch(`items.${indexMng}.fcBizs.${indexBiz}.pplInstls`); + if (!pplSum) return; + let sum = 0; + pplSum.forEach((item) => { + sum += Number(item.cpct) || 0; + }); + setSumCpct(sum); + }, [form.formState, indexMng, indexBiz]); + return ( <>
@@ -277,25 +302,23 @@ export function PbnstBuseForm({

등록차수

+ { - setBizCycle(String(val)); - getpbnstInsertIndex({ - ...pbnst.pbnsUpdateIndex, - biz: Number(val), - }); + setIndexBiz(Number(val)); }} > @@ -304,7 +327,7 @@ export function PbnstBuseForm({ type="button" size={commonButonSize} > - 저장 + 추가
@@ -314,6 +337,8 @@ export function PbnstBuseForm({ form={form} moClass="grid grid-cols-12 gap-4" sonClass="col-span-4" + indexMng={indexMng} + indexBiz={indexBiz} /> +

재이용 원수취수 현황

@@ -357,9 +391,17 @@ export function PbnstBuseForm({

재이용 공급관로 설치 현황

@@ -404,16 +446,28 @@ export function PbnstBuseForm({ )}
- { - if (!ref.current) return; + const pplSum = form.getValues( + `items.${indexMng}.fcBizs.${indexBiz}.pplInstls` + ); + if (!pplSum) return; let sum = 0; - ref.current.forEach((item) => { + pplSum.forEach((item) => { sum += Number(item.cpct) || 0; }); setSumCpct(sum); @@ -427,6 +481,8 @@ export function PbnstBuseForm({ form={form} moClass="grid grid-cols-12 gap-4" sonClass="col-span-4" + indexMng={indexMng} + indexBiz={indexBiz} />

{"하수처리수 재이용수 수요처"}

@@ -455,15 +511,19 @@ export function PbnstBuseForm({ 수요처 추가
- {fcDemands.map((field, index) => ( + {( + form.getValues( + `items.${indexMng}.fcBizs.${indexBiz}.fcDemands` + ) || [] + ).map((field, index) => (
( { f.onChange(val); - console.log("val ", val); if (val && val.length > 2) { getDemandCompList(val, 3); } }} setRtnData={(valList: any) => { if (valList) { - console.log( - " form.getValues ", - form.getValues("pbnstRuseFcltBizPk") - ); - const bizPk = - form.getValues("pbnstRuseFcltBizPk"); - - if (form.getValues("pbnstRuseFcltBizPk")) { - form.setValue( - `fcDemands.${index}.pbnstRuseFcltBizPk`, - bizPk - ); - } form.setValue( - `fcDemands.${index}.pbnstRuseFcltFk`, - form.getValues("pbnstRuseFcltFk") ?? "" + `items.${indexMng}.fcBizs.${indexBiz}.fcDemands.${index}.dmdInfoFk`, + valList.dmdInfoPk ); form.setValue( - `fcDemands.${index}.dmdCoNm`, - valList.dmdCoNm - ); - form.setValue( - `fcDemands.${index}.daddr`, + `items.${indexMng}.fcBizs.${indexBiz}.fcDemands.${index}.daddr`, valList.daddr ); form.setValue( - `fcDemands.${index}.useUsgCd`, + `items.${indexMng}.fcBizs.${indexBiz}.fcDemands.${index}.useUsgCd`, valList.useUsgCd ); form.setValue( - `fcDemands.${index}.splyCpct`, + `items.${indexMng}.fcBizs.${indexBiz}.fcDemands.${index}.splyCpct`, valList.splyCpct ); form.setValue( - `fcDemands.${index}.splyFmYn`, - valList.splyFmYn ?? "Y" + `items.${indexMng}.fcBizs.${indexBiz}.fcDemands.${index}.dmdInfoFk`, + valList.dmdInfoPk?.toString() ); - form.setValue( - `fcDemands.${index}.dmdInfoFk`, - valList.dmdInfoPk?.toString() ?? "" - ); - - // field.daddr=valList.daddr; - // field.useUsgCd=valList.useUsgCd; - // field.splyCpct=valList.splyCpct; - // field.splyFmYn=valList.splyFmYn; - // field.dmdInfoFk=valList.dmdInfoPk?.toString(); - // field.dmdCoNm=valList.dmdCoNm; } }} searchList={demandCompList?.map((item) => { @@ -543,7 +574,7 @@ export function PbnstBuseForm({
( ( ( ( ( ( setIsFcOrgwts(open)} - bodyClass={"w-[50vw] max-w-none h-[60vh]"} + bodyClass={"w-[50vw] max-w-none h-[90vh]"} body={ { setIsFcOrgwts(false); }} onRightSet={(val) => { - form.setValue("fcOrgwts", val); + form.setValue( + `items.${indexMng}.fcBizs.${indexBiz}.fcOrgwts`, + val + ); }} > } diff --git a/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegForm.tsx b/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegForm.tsx index d1eb8ed3f..bac6c6e38 100644 --- a/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegForm.tsx +++ b/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegForm.tsx @@ -1,12 +1,17 @@ "use client"; import { useWrStore } from "@/app/store"; -import { FileUpload, FormUi, SelectBox, type SelectDataType } from "@common/business_components/ui"; +import { + FileUpload, + FormUi, + SelectBox, + type SelectDataType, +} from "@common/business_components/ui"; import { Form, FormField } from "@common/business_components/ui/form"; import { Button, Input } from "@common/components"; import { zodResolver } from "@hookform/resolvers/zod"; import { useEffect, useRef, useState } from "react"; -import { useFieldArray, useForm } from "react-hook-form"; +import { useFieldArray, useForm, type UseFormReturn } from "react-hook-form"; import { z } from "zod"; import { commonButonSize, @@ -20,22 +25,30 @@ import { type customPbnst, type fcFileType, type operType, + type PbnstRegArrrayType, type selectLabel, } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type"; import { TEST_UUID } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import { Label } from "@common/business_components/ui/form/lib/label"; import React from "react"; +import RuseMngTableForm from "@/components/ui/table/pbnstReg/ruseMngTableForm/ruseMngTableForm"; export type FilesType = { atflCd: string; file: File; }; export function PbnstMngForm({ + form, formType, firstFcltData, + indexMng , + setIndexMng, }: { +form: UseFormReturn<{items:PbnstRegArrrayType}>; formType: string; firstFcltData?: customPbnst; + indexMng: number; + setIndexMng: (index: number) => void; }) { const { code, @@ -49,86 +62,84 @@ export function PbnstMngForm({ appendRuseFclt, } = useWrStore((state) => state); + const { pbnstRes } = pbnst; const [regFileList, setRegFileList] = useState(null); const [planFiles, setPlanFiles] = useState(null); const [relationfiles, setRelationFiles] = useState(null); const [fcltNm, setFcltNm] = useState(null); - const [fcOpresData, setFcOpresData] = useState(null); - const [mngMtdCode, setMngMtdCode] = useState<{ name: string, val: SelectDataType[] }[]>(); + //const [fcOpresData, setFcOpresData] = useState(null); + const [mngMtdCode, setMngMtdCode] = + useState<{ name: string; val: SelectDataType[] }[]>(); const [progress, setProgress] = useState(0); //const new File([] as BlobPart[], "") 파일 다운로드 활용 - const ref = useRef(null); + //const ref = useRef(null); - const form = useForm>({ - resolver: zodResolver(pbnstRegZod), - defaultValues: - formType === "reg" && pbnst.pbnstMngRegData - ? pbnst.pbnstMngRegData[0] - : formType === "update" && - typeof pbnst.pbnsUpdateIndex.mng === "number" && - pbnst.pbnsUpdateIndex.mng >= 0 && - pbnst.pbnstRes - ? pbnst.pbnstRes[pbnst.pbnsUpdateIndex.mng] - : formType === "sttn" && firstFcltData - ? { - ruseUtztnFcltNm: firstFcltData?.ruseUtztnFcltNm, - fcltCpct: firstFcltData?.fcltCpct, - ruseCpct: firstFcltData?.ruseCpct, - splyExtraCpct: firstFcltData?.splyExtraCpct, - fcOpers: firstFcltData?.fcOpers, - fcFiles: firstFcltData?.fcFiles, - } - : pbnstRegZod.parse({}), - mode: "onChange", - }); + + // const form = useForm>({ + // resolver: zodResolver(pbnstRegZod), + // defaultValues: + // formType === "reg" && pbnst.pbnstMngRegData + // ? pbnst.pbnstMngRegData[0] + // : formType === "update" && + // typeof pbnst.pbnsUpdateIndex.mng === "number" && + // pbnst.pbnsUpdateIndex.mng >= 0 && + // pbnst.pbnstRes + // ? pbnst.pbnstRes[pbnst.pbnsUpdateIndex.mng] + // : formType === "sttn" && firstFcltData + // ? { + // ruseUtztnFcltNm: firstFcltData?.ruseUtztnFcltNm, + // fcltCpct: firstFcltData?.fcltCpct, + // ruseCpct: firstFcltData?.ruseCpct, + // splyExtraCpct: firstFcltData?.splyExtraCpct, + // fcOpers: firstFcltData?.fcOpers, + // fcFiles: firstFcltData?.fcFiles, + // } + // : pbnstRegZod.parse({}), + // mode: "onChange", + // }); const { fields: fcOpersField, append, remove, } = useFieldArray({ control: form.control, - name: "fcOpers", + name: `items.${indexMng}.fcOpers`, }); - const handleProgress = (percentage: string) => { - setProgress(Number(percentage)); - }; + const selectFclt = (val: number) => { - if (pbnst.pbnstRes && pbnst.pbnstRes[val]) { - getBizCycle(pbnst.pbnstRes[val]); - form.reset(pbnst.pbnstRes[val]); + // if (pbnst.pbnstRes && pbnst.pbnstRes[val]) { + // getBizCycle(pbnst.pbnstRes[val]); + // // form.reset(pbnst.pbnstRes[val]); - getpbnstInsertIndex({ ...pbnst.pbnsUpdateIndex, mng: val }); - } + // getpbnstInsertIndex({ ...pbnst.pbnsUpdateIndex, mng: val }); + // } }; const plusHist = () => { - const currentTableDataFromRef = ref.current ? [...ref.current] : []; - const regData = { + append( { choose: false, - pbnstRuseFcltFk: form.getValues("pbnstRuseFcltPk") ?? "", + pbnstRuseFcltFk: form.getValues(`items.${indexMng}.pbnstRuseFcltPk`) ?? "", rgtr: "", mdfr: "", operMthd: "", rprtvBzenty: "", bgngDt: new Date(), endDt: new Date(), - }; - const newDataForRHF = [...currentTableDataFromRef, regData]; - form.setValue("fcOpers", newDataForRHF, { - shouldValidate: true, // 필요하다면 유효성 검사 실행 - shouldDirty: true, // 폼 상태를 dirty로 변경 - }); + }) + }; const removeSelected = () => { - if (!ref.current) return; - const selectedIdxs = ref.current - .map((item, idx) => (item.choose ? idx : -1)) - .filter((idx) => idx !== -1); - selectedIdxs.reverse().forEach((idx) => remove(idx)); + + const nowOpers = form.getValues(`items.${indexMng}.fcOpers`); + if(!nowOpers) return; + + const selectedIdxs = nowOpers.map((item, idx) => (item.choose ? idx : -1)) + .filter((idx) => idx !== -1); + selectedIdxs.reverse().forEach((idx) => remove(idx)); }; const fileHandler = (files: File[], type: string) => { @@ -203,79 +214,87 @@ export function PbnstMngForm({ // 등록할때 신규 값을 계속 가지고 있으려고 useEffect(() => { - if ( - formType === "reg" && - firstFcltData && - (form.getValues("swtrmtFcltFk") === "" || - form.getValues("swtrmtFcltFk") === undefined) - ) { - form.setValue("swtrmtFcltFk", firstFcltData.swtrmtFcltFk); - form.setValue("pbnstRuseFcltPk", String(firstFcltData.pbnstRuseFcltPk)); - form.setValue("fcBizs", firstFcltData.fcBizs); - } - }, [firstFcltData]); + // if ( + // formType === "reg" && + // firstFcltData && + // (form.getValues(`items.${indexMng}.swtrmtFcltFk`) === "" || + // form.getValues(`items.${indexMng}.swtrmtFcltFk`) === undefined) + // ) { + // form.setValue(`items.${indexMng}.swtrmtFcltFk`, firstFcltData.swtrmtFcltFk); + // form.setValue( + // `items.${indexMng}.pbnstRuseFcltPk`, + // String(firstFcltData.pbnstRuseFcltPk) + // ); + // form.setValue(`items.${indexMng}.fcBizs`, firstFcltData.fcBizs); + // } + console.log('indexMng ', indexMng) + }, [indexMng]); useEffect(() => { - const defaultFiles = form.getValues("fcFiles"); - - if (defaultFiles && defaultFiles.length > 0) { - const relationFileList = defaultFiles.filter( - (item) => item.fileKnd === "계통도" - ); - - const planFileList = defaultFiles.filter( - (item) => item.fileKnd === "평면도" - ); - if (relationFileList.length > 0) - setRelationFiles( - relationFileList.map((item) => ({ - atflCd: item.fileTkn, - file: new File([] as BlobPart[], item.filePath), - })) - ); // 또는 파일 형식 변환 로직이 있다면 여기에 추가 - - if (planFileList.length > 0) - setPlanFiles( - planFileList.map((item) => ({ - atflCd: item.fileTkn, - file: new File([] as BlobPart[], item.filePath), - })) + if(indexMng>=0){ + const defaultFiles = form.getValues(`items.${indexMng}.fcFiles`); + if (defaultFiles && defaultFiles.length > 0) { + const relationFileList = defaultFiles.filter( + (item) => item.fileKnd === "계통도" ); + + const planFileList = defaultFiles.filter( + (item) => item.fileKnd === "평면도" + ); + if (relationFileList.length > 0) + setRelationFiles( + relationFileList.map((item) => ({ + atflCd: item.fileTkn, + file: new File([] as BlobPart[], item.filePath), + })) + ); // 또는 파일 형식 변환 로직이 있다면 여기에 추가 + + if (planFileList.length > 0) + setPlanFiles( + planFileList.map((item) => ({ + atflCd: item.fileTkn, + file: new File([] as BlobPart[], item.filePath), + })) + ); + }else{ + setRelationFiles(null); + setPlanFiles(null); + } } - }, [form.formState.defaultValues]); // 초기화 이후 1회 실행 + }, [form.watch(`items.${indexMng}`),indexMng]); // 초기화 이후 1회 실행 // 등록할때 신규 값을 계속 가지고 있으려고 useEffect(() => { - if ( - formType === "update" && - pbnst.pbnsUpdateIndex.biz >= 0 && - pbnst.pbnstRes - ) { - const bizData = pbnst.pbnstRes[pbnst.pbnsUpdateIndex.biz]; + // if ( + // formType === "update" && + // pbnst.pbnsUpdateIndex.biz >= 0 && + // pbnst.pbnstRes + // ) { + // const bizData = pbnst.pbnstRes[pbnst.pbnsUpdateIndex.biz]; - if (bizData) { - getBizCycle(bizData); - } - } + // if (bizData) { + // getBizCycle(bizData); + // } + // } }, [pbnst.pbnsUpdateIndex, pbnst.pbnstRes, formType, getBizCycle]); //신규 등록시 입력할때 데이터 넣기 useEffect(() => { - const formData = form.watch(); - formData.fcOpers = ref.current ? [...ref.current] : []; - formData.fcFiles = regFileList ? [...regFileList] : []; - if (formType === "reg") { - console.log("formData ", formData); - pbnstMngData([formData] as customPbnst[]); - } else if (formType === "update") { - const updateRes = pbnst.pbnstRes?.map((item) => { - if (item.pbnstRuseFcltPk === item.pbnstRuseFcltPk) { - item = formData as customPbnst; - } - return item; - }); - pbnstMngData(updateRes as customPbnst[]); - } + // const formData = form.watch(); + // formData.fcOpers = ref.current ? [...ref.current] : []; + // formData.fcFiles = regFileList ? [...regFileList] : []; + // if (formType === "reg") { + // console.log("formData ", formData); + // pbnstMngData([formData] as customPbnst[]); + // } else if (formType === "update") { + // const updateRes = pbnst.pbnstRes?.map((item) => { + // if (item.pbnstRuseFcltPk === item.pbnstRuseFcltPk) { + // item = formData as customPbnst; + // } + // return item; + // }); + // pbnstMngData(updateRes as customPbnst[]); + // } }, [form.formState, regFileList, formType, pbnst.pbnstRes]); useEffect(() => { @@ -288,13 +307,12 @@ export function PbnstMngForm({ text: item.ruseUtztnFcltNm, val: String(index), })); - if (fcltNmList) setFcltNm(fcltNmList); }, [pbnst.pbnstRes]); // 2. Define a submit handler. function onSubmit(values: z.infer) { - values.fcOpers = fcOpresData || []; + values.fcOpers = []; values.fcFiles = regFileList || []; pbnstInsert(values); } @@ -310,21 +328,21 @@ export function PbnstMngForm({ } }, [planFiles]); - useEffect(() => { - console.log("form errors:", form.formState.errors); - }, [form.formState.errors]); useEffect(() => { - if(code.ruseMngMtd){ - setMngMtdCode( [{name:"ruseMngMtd",val:code.ruseMngMtd}]) - } + if (code.ruseMngMtd) { + setMngMtdCode([{ name: "ruseMngMtd", val: code.ruseMngMtd }]); + } }, [code]); + + return (
- + {/* */} +
{formType === "update" ? ( - { - selectFclt(Number(val)); - }} - value={""} + ( + + { + setIndexMng(Number(val)); + field.onChange(val); + }} + value={field.value ?? ""} + className={""} + selectClass={undefined} + /> + + )} /> ) : ( (
- { - setFcOpresData(val); + //setFcOpresData(val); }} - ref={ref} - > + indexMng={indexMng} + form={form} + formNm={"fcOpers"} + // ref={ref} + >

재이용수 공급 가능량

-
+
( { @@ -420,14 +453,16 @@ export function PbnstMngForm({ )} />
- -
+ +
( { @@ -439,13 +474,15 @@ export function PbnstMngForm({ )} />
-
+
( { diff --git a/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegFormDetail/mngRegFormDetail.tsx b/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegFormDetail/mngRegFormDetail.tsx index 7f9ff4fef..971888e10 100644 --- a/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegFormDetail/mngRegFormDetail.tsx +++ b/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegFormDetail/mngRegFormDetail.tsx @@ -1,16 +1,17 @@ -'use client' +"use client"; import { useWrStore } from "@/app/store"; import type { formDetailType } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/headList"; import { formH1Class } from "@/components/lib/class/comClass"; import { safeDate } from "@/components/lib/func/commom"; import { + DatePicker, FormField, FormUi, SearchInputSelect, SelectBox, type SelectDataType, } from "@common/business_components/ui"; -import { DatePicker, Input } from "@common/components/ui"; +import { Input } from "@common/components/ui"; import { useState } from "react"; export default function MngRegFormDetail({ @@ -19,48 +20,55 @@ export default function MngRegFormDetail({ form, moClass, sonClass, - cycle, - onIputData, - searchSelectData + indexBiz, + indexMng, }: { formList: formDetailType[]; h1Title?: string; form: any; moClass?: string; - cycle?: string; + indexBiz?: number; + indexMng?: number; sonClass?: string; - onIputData?: (data: any) => void; - searchSelectData?: SelectDataType[]; }) { const { code } = useWrStore((state) => state); - const [searchData, setSearchData]= useState('') - return ( <> {h1Title ?

{h1Title}

: <>}
- {formList?.map((item, index) => { - const fieldId = cycle ? `${cycle}.${item.id}` : item.id; + {formList?.map((formHead, index) => { + const fieldId = + typeof indexMng === "number" && + indexMng >= 0 && + typeof indexBiz === "number" && + indexBiz >= 0 + ? `items.${indexMng}.fcBizs.${indexBiz}.${formHead.id}` + : typeof indexMng === "number" && indexMng >= 0 + ? `items.${indexMng}.${formHead.id}` + : formHead.id; + return ( -
+
( - - {item.type === "select" ? ( + + {formHead.type === "select" ? ( - ) : item.type === "date" ? ( + ) : formHead.type === "date" ? ( - field.onChange(date) - } className={"rounded-lg !w-full"} + field={{ + value: safeDate(field.value) || new Date(), + onChange: (date: Date | undefined) => + field.onChange(date), + }} + selectClass={"w-full"} /> - ) : item.type === "number" ? ( + ) : formHead.type === "number" ? ( { field.onChange(Number(e.target.value)); }} + readOnly={formHead.option === "readOnly"?true:false} /> - ) : item.type === "selectYn" ? ( + ) : formHead.type === "selectYn" ? ( field.onChange(val) } - value={field.value} + value={field.value ?? "Y"} /> ) : ( )} @@ -98,4 +108,3 @@ export default function MngRegFormDetail({ ); } - diff --git a/apps/wr/components/ui/modal/fcltReg/fcOrgwtsRegModal/fcOrgwtsRegModal.tsx b/apps/wr/components/ui/modal/fcltReg/fcOrgwtsRegModal/fcOrgwtsRegModal.tsx index 1b6b3950e..a6dd7bf2d 100644 --- a/apps/wr/components/ui/modal/fcltReg/fcOrgwtsRegModal/fcOrgwtsRegModal.tsx +++ b/apps/wr/components/ui/modal/fcltReg/fcOrgwtsRegModal/fcOrgwtsRegModal.tsx @@ -22,7 +22,6 @@ export default function FcOrgwtsRegModal({ onRightSet, closeModal }: { onRightS const [inputVal, setInputVal] = useState(""); useEffect(()=>{ - console.log("searchFclts", searchFclts); if(Array.isArray(searchFclts)){ const filteredData = searchFclts.filter((item) => { if(rightData){ diff --git a/apps/wr/components/ui/modal/fcltReg/pbnstRegModal/pbnstRegModal.tsx b/apps/wr/components/ui/modal/fcltReg/pbnstRegModal/pbnstRegModal.tsx index 736fa6b41..a899f8128 100644 --- a/apps/wr/components/ui/modal/fcltReg/pbnstRegModal/pbnstRegModal.tsx +++ b/apps/wr/components/ui/modal/fcltReg/pbnstRegModal/pbnstRegModal.tsx @@ -1,9 +1,8 @@ "use client"; import { useWrStore } from "@/app/store"; import { - pbnstRegZod, type customPbnst, - type fcBizType, + type PbnstRegArrrayType, type pubHasuType, } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type"; import { PbnstMngForm } from "@/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegForm"; @@ -17,64 +16,88 @@ import { } from "@common/components/ui"; import { useEffect, useState } from "react"; import { PbnstBuseForm } from "@/components/ui/form/fcltReg/pbnstReg/buseReg/bugRegForm"; +import { useFieldArray, type UseFormReturn } from "react-hook-form"; +import { writeRgtrAndMdfr } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg"; -export function PbnstRegModal({ data }: { data: pubHasuType }) { +export function PbnstRegModal({ + data, + form, +}: { + data: pubHasuType; + form: UseFormReturn<{ items: PbnstRegArrrayType }>; +}) { const { pbnst, pbnstInsert, pbnstMngData } = useWrStore((state) => { return state; }); - - const { pbnstRes } = pbnst; const [pbnstBdstForm, setPbnstBdstForm] = useState( {} as customPbnst ); const [currentTab, setCurrentTab] = useState("mng"); + const [indexMng, setIndexMng] = useState(0); + const [indexBiz, setIndexBiz] = useState(0); + const onSubmit = async (valuse: { items: PbnstRegArrrayType }) => { + + const item = valuse.items[indexMng]; + const data = item ? writeRgtrAndMdfr([item]) : []; - const pbnstRegTotal = () => { - if (pbnst.pbnstMngRegData[0]) pbnstInsert(pbnst.pbnstMngRegData[0]); - }; + if(data && data[0]){ + pbnstInsert(data[0]) + } + }; const handleTabChange = (value: string) => { setCurrentTab(value); - }; + }; + + useEffect(() => { + console.log("form errors:", form.formState.errors); + }, [form.formState.errors]); + + useEffect(() => { if (data) { - let regData; - if (pbnstRes && pbnstRes?.length > 0) { - regData = { - swtrmtFcltFk: String(data.bscFctCd), - pbnstRuseFcltPk: String(data.bscFctCd) + String(pbnstRes.length + 1), - fcBizs: [ - { - pbnstRuseFcltFk: - String(data.bscFctCd) + String(pbnstRes.length + 1), - cycl: 1, - } as unknown as fcBizType, - ], - }; - //regData= pbnstRegZod.parse(regData) - //setPbnstBdstForm(regData as unknown as customPbnst); - // pbnstMngData([regData] as unknown as customPbnst[]) - } else { - regData = { - swtrmtFcltFk: String(data.bscFctCd), - pbnstRuseFcltPk: String(data.bscFctCd + "1"), - fcBizs: [ - { - pbnstRuseFcltFk: String(data.bscFctCd + "1"), - cycl: 1, - } as unknown as fcBizType, - ], - }; - //regData= pbnstRegZod.parse(regData) - // setPbnstBdstForm(regData as unknown as customPbnst); + const firstForm = form.getValues("items"); - // pbnstMngData([regData] as unknown as customPbnst[]) - } - regData = pbnstRegZod.parse(regData); - setPbnstBdstForm(regData as unknown as customPbnst); + console.log('mngIndex ', firstForm.length) + setIndexMng(firstForm.length - 1) + // console.log(' firstForm ', firstForm) + // let regData; + // if (pbnstRes && pbnstRes?.length > 0) { + // regData = { + // swtrmtFcltFk: String(data.bscFctCd), + // pbnstRuseFcltPk: String(data.bscFctCd) + String(pbnstRes.length + 1), + // fcBizs: [ + // { + // pbnstRuseFcltFk: + // String(data.bscFctCd) + String(pbnstRes.length + 1), + // cycl: 1, + // } as unknown as fcBizType, + // ], + // }; + // //regData= pbnstRegZod.parse(regData) + // //setPbnstBdstForm(regData as unknown as customPbnst); + // // pbnstMngData([regData] as unknown as customPbnst[]) + // } else { + // regData = { + // swtrmtFcltFk: String(data.bscFctCd), + // pbnstRuseFcltPk: String(data.bscFctCd + "1"), + // fcBizs: [ + // { + // pbnstRuseFcltFk: String(data.bscFctCd + "1"), + // cycl: 1, + // } as unknown as fcBizType, + // ], + // }; + // //regData= pbnstRegZod.parse(regData) + // // setPbnstBdstForm(regData as unknown as customPbnst); + + // // pbnstMngData([regData] as unknown as customPbnst[]) + // } + // regData = pbnstRegZod.parse(regData); + // setPbnstBdstForm(regData as unknown as customPbnst); } - }, [data, pbnstRes]); + }, [data, form]); return ( <> @@ -93,7 +116,7 @@ export function PbnstRegModal({ data }: { data: pubHasuType }) { 차수별정보 - + diff --git a/apps/wr/components/ui/searchInput/searchInput.tsx b/apps/wr/components/ui/searchInput/searchInput.tsx index 984124abf..796c8c298 100644 --- a/apps/wr/components/ui/searchInput/searchInput.tsx +++ b/apps/wr/components/ui/searchInput/searchInput.tsx @@ -62,7 +62,9 @@ export default function SearchInputText({ document.removeEventListener("mousedown", handleClickOutside); }; }, []); - +useEffect(() =>{ + console.log('searchList ', searchList) +},[searchList]) return (
diff --git a/apps/wr/components/ui/table/pbnstReg/ruseMngTable/ruseMngTable.tsx b/apps/wr/components/ui/table/pbnstReg/ruseMngTable/ruseMngTable.tsx index f76ed23bb..e4ffc1f8d 100644 --- a/apps/wr/components/ui/table/pbnstReg/ruseMngTable/ruseMngTable.tsx +++ b/apps/wr/components/ui/table/pbnstReg/ruseMngTable/ruseMngTable.tsx @@ -1,9 +1,13 @@ import { headMakeprfmnc } from "@/app/ruseFcltMng/prfmncReg/chkgdnReg/TableHead"; +import type { TableUpperProps } from "@/app/store/common/type/header"; import type { chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList"; -import type { customPbnst as OriginalCustomPbnst } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type"; +import { selectClass } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; -import { selectClass, type TableUpperProps } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; -import { DatePicker, SelectBox, type SelectDataType } from "@common/business_components/ui"; +import { + DatePicker, + SelectBox, + type SelectDataType, +} from "@common/business_components/ui"; import { Checkbox, Input, @@ -20,43 +24,41 @@ type RuseMngTableProps = { tableData: any[]; headList: TableUpperProps[]; upHeadList: chHeadType[]; - code?: { name: string, val: SelectDataType[] }[]; - onTableSet?:(item:any)=> void; + code?: { name: string; val: SelectDataType[] }[]; + onTableSet?: (item: any) => void; + indexMng?: number; + indexBiz?: number; }; const RuseMngTable = React.forwardRef( - ({ - tableData, - headList, - upHeadList, - code, - onTableSet - }, ref) => { + ( + { tableData, headList, upHeadList, code, onTableSet, indexMng, indexBiz }, + ref + ) => { const [tableState, setTableState] = useState([...tableData]); useEffect(() => { if (ref && typeof ref === "object" && "current" in ref) { ref.current = tableState; } - if(onTableSet) - onTableSet (tableState) - }, [tableState,onTableSet]); + if (onTableSet) onTableSet(tableState); + }, [tableState, onTableSet]); - - useEffect(() => { - if(tableData) - setTableState(tableData); + if (tableData) setTableState(tableData); }, [tableData]); return ( <> - +
{upHeadList ? ( headMakeprfmnc(headList, upHeadList) ) : ( {headList.map((head) => ( - + {head.title} ))} @@ -71,54 +73,58 @@ const RuseMngTable = React.forwardRef( { }} + onClick={() => {}} > {head.edit === true ? ( { - setTableState(prev => { + setTableState((prev) => { const next = [...prev]; - next[i] = { ...next[i], [head.id]: txt.target.value }; + next[i] = { + ...next[i], + [head.id]: txt.target.value, + }; return next; - }) + }); }} - value={head.type === "number" ? - Number(tableState[i][head.id])||0 : tableState[i][head.id] || "" + value={ + head.type === "number" + ? Number(tableState[i][head.id]) || 0 + : tableState[i][head.id] || "" } /> ) : head.type === "select" ? ( item.name === head.selectData)?.val ?? []} - value={ - tableState[i][head.id] || "" + selectArray={ + code?.find((item) => item.name === head.selectData) + ?.val ?? [] } + value={tableState[i][head.id] || ""} className={""} selectClass={selectClass} onSelectValue={(val) => { setTableState((prev) => { - prev[i][head.id] = val - return [...prev] - }) + prev[i][head.id] = val; + return [...prev]; + }); }} > ) : head.type === "date" ? ( { - setTableState(prev => { + setTableState((prev) => { const next = [...prev]; next[i] = { ...next[i], [head.id]: date }; return next; - }) - } - } - } + }); + }, + }} selectClass={"w-full"} /> ) : head.type === "checkbox" ? ( @@ -128,14 +134,12 @@ const RuseMngTable = React.forwardRef( onCheckedChange={(checked) => { console.log("checked", checked); setTableState((prev) => { - prev[i][head.id] = checked - return [...prev] - }) + prev[i][head.id] = checked; + return [...prev]; + }); }} - > - - ) : - ( + > + ) : ( `${item[head.id] || ""}` )} @@ -146,5 +150,6 @@ const RuseMngTable = React.forwardRef(
); - }) -export default RuseMngTable; \ No newline at end of file + } +); +export default RuseMngTable; diff --git a/apps/wr/components/ui/table/pbnstReg/ruseMngTableForm/ruseMngTableForm.tsx b/apps/wr/components/ui/table/pbnstReg/ruseMngTableForm/ruseMngTableForm.tsx new file mode 100644 index 000000000..2eeba6c69 --- /dev/null +++ b/apps/wr/components/ui/table/pbnstReg/ruseMngTableForm/ruseMngTableForm.tsx @@ -0,0 +1,163 @@ +import { headMakeprfmnc } from "@/app/ruseFcltMng/prfmncReg/chkgdnReg/TableHead"; +import type { TableUpperProps } from "@/app/store/common/type/header"; +import type { chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList"; +import type { customPbnst as OriginalCustomPbnst } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type"; +import { selectClass } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; + +import { + DatePicker, + FormField, + FormUi, + SelectBox, + type SelectDataType, +} from "@common/business_components/ui"; +import { + Checkbox, + Input, + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@common/components/ui"; +import React, { useEffect, useState } from "react"; + +type RuseMngTableProps = { + tableData: any[]; + headList: TableUpperProps[]; + upHeadList: chHeadType[]; + code?: { name: string; val: SelectDataType[] }[]; + onTableSet?: (item: any) => void; + indexMng?: number; + indexBiz?: number; + form?: any; + formNm?:string +}; + +const RuseMngTableForm = React.forwardRef( + ({ tableData, headList, upHeadList, code, onTableSet, indexMng, form,formNm,indexBiz }, ref) => { + // const [tableState, setTableState] = useState([...tableData]); + + // // useEffect(() => { + + // // if (ref && typeof ref === "object" && "current" in ref) { + // // ref.current = tableState; + // // } + // // if (onTableSet) onTableSet(tableState); + // // }, [tableState, onTableSet]); + + // useEffect(() => { + + // if (tableData) + // setTableState(tableData); + // }, [tableData]); + + return ( + <> + + + {upHeadList ? ( + headMakeprfmnc(headList, upHeadList) + ) : ( + + {headList.map((head) => ( + + {head.title} + + ))} + + )} + + + + {tableData.map((item, i) => ( + + {headList.map((head, j) => ( + {}} + > + = 0 && + typeof indexBiz === "number" && + indexBiz >= 0? + `items.${indexMng}.fcBizs.${indexBiz}.${formNm}.${i}.${head.id}`: + typeof indexMng === "number" && indexMng >= 0? + `items.${indexMng}.${formNm}.${i}.${head.id}`: + `items.${indexMng}.${formNm}.${i}.${head.id}`} + render={({ field }) => ( + + {head.edit === true ? ( + { + field.onChange(txt.target.value); + }} + value={ + head.type === "number" + ? (Number(field.value) ?? 0) + : field.value || "" + } + /> + ) : head.type === "select" ? ( + item.name === head.selectData + )?.val ?? [] + } + value={ + field.value || "" + } + className={""} + selectClass={selectClass} + onSelectValue={(val) => { + field.onChange(val); + }} + > + ) : head.type === "date" ? ( + + field.onChange(date), + }} + selectClass={"w-full"} + /> + ) : head.type === "checkbox" ? ( + { + field.onChange(checked); + + }} + > + ) : ( + `${item[head.id] || ""}` + )} + + )} + /> + + ))} + + ))} + +
+ + ); + } +); +export default RuseMngTableForm; From 7cd86cffb1c0ceeb1df96f5a15b9a2af5a87408c Mon Sep 17 00:00:00 2001 From: leedj312 Date: Tue, 17 Jun 2025 09:10:54 +0900 Subject: [PATCH 12/12] =?UTF-8?q?=EC=88=98=EC=9A=94=EB=A7=A4=EC=B9=AD=20?= =?UTF-8?q?=EA=B2=80=ED=86=A0=20=EC=9E=91=EC=97=85=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/matMng/coMat/coMatRvw/page.tsx | 1735 +++++++++-------- .../prfmncSttn/pbnstPrfmncSttn/page.tsx | 6 +- .../wr/app/store/matDmd/coMatRvw/headList.tsx | 10 +- apps/wr/app/store/matDmd/coMatRvw/index.tsx | 42 +- apps/wr/app/store/matDmd/coMatRvw/type.tsx | 70 + .../fcltReg/pbnstReg/mngReg/mngRegForm.tsx | 3 - .../fcltReg/bdstRegModal/bdstRegModal.tsx | 1 - .../fcOrgwtsRegModal/fcOrgwtsRegModal.tsx | 1 - 8 files changed, 1030 insertions(+), 838 deletions(-) create mode 100644 apps/wr/app/store/matDmd/coMatRvw/type.tsx diff --git a/apps/wr/app/matMng/coMat/coMatRvw/page.tsx b/apps/wr/app/matMng/coMat/coMatRvw/page.tsx index 248a45484..d661e60d6 100644 --- a/apps/wr/app/matMng/coMat/coMatRvw/page.tsx +++ b/apps/wr/app/matMng/coMat/coMatRvw/page.tsx @@ -1,847 +1,942 @@ "use client"; import { useWrStore } from "@/app/store"; +import {DmdCoReqSchema, type DmdCoReqType, type DmdMatTableType} from "@/app/store/matDmd/coMatRvw/type"; import { formH1Class, formTableName } from "@/components/lib/class/comClass"; -import { getCity } from "@/components/lib/func/commom"; +import { getCity, tableData, yearOptions } from "@/components/lib/func/commom"; import { CmpttnModal } from "@/components/ui/modal/coMat/cmpttnModal"; import { CoMatModal } from "@/components/ui/modal/coMat/coMatModal"; import type { objSearchType } from "@/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal"; -import { ContentsDiv, Form, FormField, FormUi, ScrollArea, SearchDiv, SearchFormLeft, SearchFormRight, SearchInput, SelectBox, Title, UiModal, UiTable, type SelectDataType } from "@common/business_components/ui"; +import { + ContentsDiv, + Form, + FormField, + FormUi, + ScrollArea, + SearchDiv, + SearchFormLeft, + SearchFormRight, + SearchInput, + SelectBox, + Title, + UiModal, + UiTable, + type SelectDataType, +} from "@common/business_components/ui"; import ListDiv from "@common/business_components/ui/list_div"; import { Button, DatePicker, Input, Label } from "@common/components/ui"; -import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@common/components/ui/tooltip"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@common/components/ui/tooltip"; import { zodResolver } from "@hookform/resolvers/zod"; -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import { useFieldArray, useForm } from "react-hook-form"; +import toast, { Toaster } from "react-hot-toast"; import { z } from "zod"; - +import moment from "moment"; export default function CoMatRvw() { - const { code, coRvw, } = useWrStore((state) => state); - const { coRvwHeadList, } = coRvw; - const [fromDate, setFromDate] = useState(new Date()); - const [toDate, setToDate] = useState(new Date()); - const [selectSgg, setSelectSgg] = useState() - const [objSearch, setObjSearch] = useState({ sgg: "", city: "" }); - const [isPrcsMo, setIsPrcsMo] = useState<{ - isModal: boolean; - }>({ isModal: false }); - const [isTrfMo, setIsTrfMo] = useState<{ - isModal: boolean; - }>({ isModal: false, }); - const [isCmpttnMo, setIsCmpttnMo] = useState<{ - isModal: boolean; - }>({ isModal: false, }); + const { code, coRvw ,coMatRvwInit} = useWrStore((state) => state); +const {coMatRvwRes} = coRvw + + const initRef = useRef(false); + const { coRvwHeadList } = coRvw; + const [dmdMatData, setDmdMtaData] = useState([]); + const [selectSgg, setSelectSgg] = useState(); + const [objSearch, setObjSearch] = useState({ + sgg: "", + city: "", + }); + const [isPrcsMo, setIsPrcsMo] = useState<{ + isModal: boolean; + }>({ isModal: false }); + const [isTrfMo, setIsTrfMo] = useState<{ + isModal: boolean; + }>({ isModal: false }); + const [isCmpttnMo, setIsCmpttnMo] = useState<{ + isModal: boolean; + }>({ isModal: false }); + const [fromDate, setFromDate] = useState( + String(new Date().getFullYear()) + ); + const [toDate, setToDate] = useState( + String(new Date().getFullYear()) + ); + const [selectData, setSelectData] = useState({} as DmdCoReqType) + const form = useForm>({ + resolver: zodResolver(DmdCoReqSchema), + }) + + const TableCellClick = (index:number) =>{ + console.log(coMatRvwRes ) + if(coMatRvwRes && coMatRvwRes[index]){ + + console.log(dmdMatData[index]) - const schema = z.object({ - fcltCpct: z.number().optional(), - }); + setSelectData(coMatRvwRes[index] ) + } - const form = useForm>({ - resolver: zodResolver(schema), - defaultValues: { - fcltCpct: 0, - } - }); + } - const getSelCity = (val: string | number) => { - const cityValue = String(val); // Ensure val is treated as a string - const data = getCity(cityValue, code.sggCd); - setSelectSgg(data); - setObjSearch({ city: cityValue, sgg: '' }); - }; + useEffect(()=>{ + if(coMatRvwRes){ + const data =coMatRvwRes.map((item)=>{ + return ({ + ...item, + regDt: moment(item.regDt).format('YYYY-MM-DD') , + state:'' + })}) + setDmdMtaData(tableData(data,{code}) ) + } + },[coMatRvwRes]) - const getSgg = (val: string | number) => { - console.log(val); - setObjSearch({ ...objSearch, sgg: String(val) }) - }; + const getSelCity = (val: string | number) => { + const cityValue = String(val); // Ensure val is treated as a string + const data = getCity(cityValue, code.sggCd); + setSelectSgg(data); + setObjSearch({ city: cityValue, sgg: "" }); + }; - useEffect(() => { - if (fromDate > toDate) { - const newFromDate = new Date(toDate); - newFromDate.setDate(toDate.getDate() - 1); - setFromDate(newFromDate); - } - }, [toDate]); + const getSgg = (val: string | number) => { + setObjSearch({ ...objSearch, sgg: String(val) }); + }; - return ( - <> - -
-
- - <SearchDiv> - <SearchFormLeft> - <div className="col-span-8 flex flex-row"> - <SelectBox - className="col-span-2 w-1/3 h-full text-2xl" - label="시도" - selectClass={""} - selectArray={code.cityCd || []} - onSelectValue={getSelCity} - /> - <SelectBox - className="col-span-2 w-1/3 h-full text-2xl ml-4" - label="시군구" - selectClass={""} - selectArray={selectSgg || []} - onSelectValue={getSgg} - /> - <div className="col-span-5 w-full"> - <div className="flex flex-row items-center"> - <Label className="text-xl text-gray-600 ml-4 mr-4">수요신청년도</Label> - <div className="flex flex-row"> - <DatePicker mode={'single'} - selected={fromDate} - onSelect={(date: Date | undefined) => { if (date) setFromDate(date) }} /> - <span className="ml-2 mr-2">~</span> - <DatePicker mode={'single'} - selected={toDate} - onSelect={(date: Date | undefined) => { if (date) setToDate(date) }} /> - </div> - </div> - </div> - <SearchInput - className={"text-2xl"} - label="회사명" - textValue={""} - setText={(e) => { - }} - /> - </div> - </SearchFormLeft> - <SearchFormRight - className="w-2/12 mx-5 flex flex-col items-center justify-center space-x-2 "> - <div className="space-y"> - <div className="flex flex-row space-x-2"> - <Button - size={"sm"} - onClick={(e) => { }} - > - 조회 - </Button> - </div> - </div> - </SearchFormRight> - </SearchDiv> + +useEffect(() =>{ + if(!initRef.current){ + coMatRvwInit(1,13,'11',fromDate,toDate) + initRef.current = true; + } + +},[coMatRvwInit,initRef,fromDate,toDate]) + + +useEffect(() =>{ + if(selectData){ + console.log(selectData) + form.reset(selectData) + } + +},[selectData,form ] ) + return ( + <> + <ContentsDiv> + <div className="grid grid-cols-4 gap-4"> + <div className="col-span-4"> + <Title title={"수요매칭검토"} /> + <SearchDiv> + <SearchFormLeft> + <div className="col-span-10 flex flex-row"> + <SelectBox + className="col-span-2 w-1/3 h-full text-2xl" + label="시도" + selectClass={""} + selectArray={code.cityCd || []} + onSelectValue={getSelCity} + /> + <SelectBox + className="col-span-2 w-1/3 h-full text-2xl ml-4" + label="시군구" + selectClass={""} + selectArray={selectSgg || []} + onSelectValue={getSgg} + /> + <div className="col-span-7 w-full"> + <div className="flex flex-row items-center"> + <Label className="text-xl text-gray-600 mx-6"> + 하수 재이용년도 + </Label> + <SelectBox + className="h-full w-32 text-2xl" + label="" + selectClass={""} + selectArray={yearOptions} + value={fromDate} + onSelectValue={(val: string | number) => + setFromDate(String(val)) + } + /> + <span className="mx-6">~</span> + <SelectBox + className="h-full w-32 text-2xl" + label="" + selectClass={""} + selectArray={yearOptions} + value={toDate} + onSelectValue={(val: string | number) => + setToDate(String(val)) + } + /> + <div className="col-span-2 ml-6"> + <SearchInput + className={"text-2xl"} + label="회사명" + textValue={""} + setText={(e) => {}} + /> + </div> </div> + </div> </div> + </SearchFormLeft> + <SearchFormRight className="w-2/12 mx-5 flex flex-col items-center justify-center space-x-2 "> + <div className="space-y"> + <div className="flex flex-row space-x-2"> + <Button + size={"sm"} + onClick={(e) => { + if (fromDate && toDate) { + const fromNum = Number(fromDate); + const toNum = Number(toDate); + if (fromNum > toNum) { + toast.error( + "시작년도가 종료년도 이후로 설정할 수 없습니다." + ); + } else { + } + } + }} + > + 조회 + </Button> + </div> + </div> + </SearchFormRight> + </SearchDiv> + </div> + </div> - <div className="grid grid-cols-6 gap-4"> - <div className="col-span-6"> - <ListDiv> - <UiTable - headName={"수요매칭검토현황"} - tableData={[]} - children={undefined} - headlist={coRvwHeadList} - pageSize={20} - total={100000} - cellClick={(index: number | undefined, headId: string) => { + <div className="grid grid-cols-6 g ap-4"> + <div className="col-span-6"> + <ListDiv> + <UiTable + headName={"수요매칭검토현황"} + tableData={dmdMatData||[]} + headlist={coRvwHeadList} + pageSize={20} + total={100000} + cellClick={(index:number|undefined, headId:string) =>{ + if(index !==undefined&& index>=0){ + + TableCellClick(index) + } + } } + onPageChange={() => {}} + ></UiTable> + </ListDiv> + <hr /> + <ScrollArea className="h-[49vh]"> + <ListDiv> + <h3 className="mt-4 ml-2 text-2xl font-medium text-label"> + 수요신청 상세현황 + </h3> + <Form {...form}> + <div className="grid grid-cols-12 gap-4 ml-4 mr-4"> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="regDt" + render={({ field }) => ( + <FormUi label="요구시기"> + <Input + placeholder="" + type="text" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={ moment(field.value).format('YYYY-MM-DD') ?? ""} + readOnly + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="dmndQty" + render={({ field }) => ( + <FormUi label="요구수량(M3/d)"> + <Input + placeholder="" + type="number" + step="0.1" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="useUsgCd" + render={({ field }) => ( + <FormUi label="사용용도"> + <Input + placeholder="" + type="text" + step="0.1" + onChange={(e) => { + field.onChange(e.target.value); + }} + value={field.value ?? ''} + readOnly + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="wntUntprc" + render={({ field }) => ( + <FormUi label="희망단가(원/m3)"> + <Input + placeholder="" + type="number" + step="0.1" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-12 w-full"> + <h1 className={formH1Class}>요구수질</h1> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="grssClfg" + render={({ field }) => ( + <FormUi label="총대장균군수 (개/100ml)"> + <Input + placeholder="" + type="number" + step="0.1" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="combResdch" + render={({ field }) => ( + <FormUi label="결합잔류염소(mg/L)"> + <Input + placeholder="" + type="number" + step="0.1" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="trbt" + render={({ field }) => ( + <FormUi label="탁도(NTU)"> + <Input + placeholder="" + type="number" + step="0.1" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="blgcOxygDmndQnt" + render={({ field }) => ( + <FormUi label="생물학적 산소요구량(BOD)(mg/L)"> + <Input + placeholder="" + type="number" + step="0.1" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="smll" + render={({ field }) => ( + <FormUi label="냄새"> + <Input + placeholder="" + type="number" + step="0.1" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="crmty" + render={({ field }) => ( + <FormUi label="색도(도)"> + <Input + placeholder="" + type="number" + step="0.1" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="tn" + render={({ field }) => ( + <FormUi label="총질소 (T-N)(mg/L)"> + <Input + placeholder="" + type="number" + step="0.1" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="tph" + render={({ field }) => ( + <FormUi label="총인(T-P)(mg/L)"> + <Input + placeholder="" + type="number" + step="0.1" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="ph" + render={({ field }) => ( + <FormUi label="수소이온농도(pH)"> + <Input + placeholder="" + type="number" + step="0.1" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="clIonQnt" + render={({ field }) => ( + <FormUi label="염화물(mgCL/L)"> + <Input + placeholder="" + type="number" + step="0.1" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="cdtnv" + render={({ field }) => ( + <FormUi label="전기전도도(㎲/cm)"> + <Input + placeholder="" + type="number" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="rmrk" + render={({ field }) => ( + <FormUi label="비고"> + <Input + placeholder="" + type="text" + onChange={(e) => { + field.onChange(e.target.value); + }} + value={field.value ?? ""} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-12 w-full"> + <h1 className={formH1Class}>공급처 후보지</h1> + </div> + <div className="col-span-4 mt-4"> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label="후보지1"> + <Input + placeholder="" + type="text" + onChange={(e) => { + field.onChange(String(e.target.value)); + }} + value={field.value ?? ""} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-4 mt-4"> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label="후보지2"> + <Input + placeholder="" + type="text" + onChange={(e) => { + field.onChange(e.target.value); + }} + value={field.value ?? ""} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-4 mt-4"> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label="후보지3"> + <Input + placeholder="" + type="text" + onChange={(e) => { + field.onChange(e.target.value); + }} + value={field.value ?? ""} + /> + </FormUi> + )} + /> + </div> + </div> + </Form> + <hr className="mt-8" /> + <Form {...form}> + <h3 className="mt-4 ml-2 text-2xl font-medium text-label"> + 표준공사비 산정 + </h3> + <div className="flex items-center mx-3 mb-3"> + <h1 className="">처리시설 표준공사비 산정</h1> + + <Button size={"sm"} onClick={(e) => {}}> + 계산 + </Button> + <Button size={"sm"} onClick={(e) => {}}> + 저장 + </Button> + </div> + <div className="grid grid-cols-12 gap-4 ml-4 mr-4"> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label="용도"> + <Input + placeholder="" + type="text" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? ""} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label="요구수량(M3/d)"> + <Input + placeholder="" + type="number" + step="0.1" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <Label className=""> + 용도에 따른 처리공정 + <i + className="diveicon di-search" + onClick={(e) => setIsPrcsMo({ isModal: true })} + /> + </Label> + + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + type="text" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value || ""} + className="mt-2" + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label="처리시설 용량(요구수량 * 365일)"> + <Input + placeholder="" + type="number" + step="0.001" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <div className="flex items-center justify-between"> + <Label>처리시설용량에 따른 공사비(백만원)</Label> + <Button + size={"sm"} + onClick={(e) => setIsCmpttnMo({ isModal: true })} + className="bg-none" + > + 공사비 산정표 보기 + </Button> + </div> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + type="number" + step="0.001" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <div className="flex items-center justify-between"> + <Label>시설부대경비 요율(%)</Label> + <Button + size={"sm"} + onClick={(e) => setIsTrfMo({ isModal: true })} + > + 요율표 보기 + </Button> + </div> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + type="number" + step="0.01" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + + <div className="col-span-3 mt-4"> + <Label> + 총사업비 (백만원) + <TooltipProvider> + <Tooltip> + <TooltipTrigger asChild> + <i className="diveicon di-search" /> + </TooltipTrigger> + <TooltipContent> + <div className="font-bold mb-1 text-xl"> + 총사업비 계산방법 + </div> + <div className="text-lg"> + 하수처리수 재이용시설 총 사업비 = + 공사비+시설부대경비{" "} + </div> + </TooltipContent> + </Tooltip> + </TooltipProvider> + </Label> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + className="mt-2" + type="number" + step="0.01" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="col-span-3 mt-4"> + <div className="flex items-center justify-between"> + <Label>공급처 선정</Label> + <Button + size={"sm"} + onClick={(e) => {}} + className="bg-none" + > + 후보지 조회 + </Button> + </div> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label=""> + <Input + placeholder="" + type="text" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? ""} + /> + </FormUi> + )} + /> + </div> + + <div className="col-span-4 mt-4"> + <div> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <FormUi label="공급관로 표준공사비(백만원)"> + <Input + placeholder="" + type="text" + step="0.001" + onChange={(e) => { + field.onChange(Number(e.target.value)); + }} + value={field.value ?? 0} + /> + </FormUi> + )} + /> + </div> + <div className="mt-4"> + <Label>관로 표준공사비 산정 프로그램</Label> + <Button + size={"sm"} + onClick={(e) => {}} + className="bg-none" + > + 다운로드 + </Button> + </div> + <div className="col-span-4 mt-4 mb-3"> + <FormField + control={form.control} + name="" + render={({ field }) => ( + <Label className="text-xl"> + 처리시설 + 공급관로 총사업비(백만원) + <FormUi label=""> + <Input + placeholder="" + type="text" + step="0.001" + onChange={(e) => { + field.onChange(Number(e.target.value)); }} - onPageChange={() => { }} - ></UiTable> - <hr /> - <ScrollArea className="h-[49vh]"> - <h3 className="mt-4 ml-2 text-2xl font-medium text-label">수요신청 상세현황</h3> - <Form {...form}> - <div className="grid grid-cols-12 gap-4 ml-4 mr-4"> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="요구시기"> - <Input - placeholder="" - type="text" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? ""} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="요구수량(M3/d)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="사용용도"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="희망단가(원/m3)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-12 w-full"> - <h1 className={formH1Class}>요구수질</h1> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="총대장균군수 (개/100ml)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="결합잔류염소(mg/L)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="탁도(NTU)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="생물학적 산소요구량(BOD)(mg/L)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="냄새"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="색도(도)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="총질소 (T-N)(mg/L)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="총인(T-P)(mg/L)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="수소이온농도(pH)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="염화물(mgCL/L)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="전기전도도(㎲/cm)"> - <Input - placeholder="" - type="number" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="비고"> - <Input - placeholder="" - type="text" - onChange={(e) => { - field.onChange(e.target.value); - }} - value={field.value ?? ""} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-12 w-full"> - <h1 className={formH1Class}>공급처 후보지</h1> - </div> - <div className="col-span-4 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="후보지1"> - <Input - placeholder="" - type="text" - onChange={(e) => { - field.onChange(String(e.target.value)); - }} - value={field.value ?? ""} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-4 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="후보지2"> - <Input - placeholder="" - type="text" - onChange={(e) => { - field.onChange(e.target.value); - }} - value={field.value ?? ""} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-4 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="후보지3"> - <Input - placeholder="" - type="text" - onChange={(e) => { - field.onChange(e.target.value); - }} - value={field.value ?? ""} - /> - </FormUi> - )} - /> - </div> - </div> - </Form> - <hr className="mt-8" /> - <Form {...form}> - <h3 className="mt-4 ml-2 text-2xl font-medium text-label">표준공사비 산정</h3> - <div className="flex items-center mx-3 mb-3"> - <h1 className="">처리시설 표준공사비 산정</h1> - - <Button - size={"sm"} - onClick={(e) => { }} - > - 계산 - </Button> - <Button - size={"sm"} - onClick={(e) => { }} - > - 저장 - </Button> - - </div> - <div className="grid grid-cols-12 gap-4 ml-4 mr-4"> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="용도"> - <Input - placeholder="" - type="text" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? ""} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="요구수량(M3/d)"> - <Input - placeholder="" - type="number" - step="0.1" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <Label className="">용도에 따른 처리공정<i className="diveicon di-search" onClick={(e) => setIsPrcsMo({ isModal: true })} /></Label> - - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label=""> - <Input - placeholder="" - type="text" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value || ""} - className="mt-2" - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="처리시설 용량(요구수량 * 365일)"> - <Input - placeholder="" - type="number" - step="0.001" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <div className="flex items-center justify-between"> - <Label>처리시설용량에 따른 공사비(백만원)</Label> - <Button - size={"sm"} - onClick={(e) => setIsCmpttnMo({ isModal: true })} - className="bg-none" - > - 공사비 산정표 보기 - </Button> - </div> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label=""> - <Input - placeholder="" - type="number" - step="0.001" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <div className="flex items-center justify-between"> - <Label>시설부대경비 요율(%)</Label> - <Button - size={"sm"} - onClick={(e) => setIsTrfMo({ isModal: true })} - > - 요율표 보기 - </Button> - </div> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label=""> - <Input - placeholder="" - type="number" - step="0.01" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - - <div className="col-span-3 mt-4"> - <Label>총사업비 (백만원) - <TooltipProvider> - <Tooltip> - <TooltipTrigger asChild> - <i className="diveicon di-search" /> - </TooltipTrigger> - <TooltipContent> - <div className="font-bold mb-1 text-xl">총사업비 계산방법</div> - <div className="text-lg">하수처리수 재이용시설 총 사업비 = 공사비+시설부대경비 </div> - </TooltipContent> - </Tooltip> - </TooltipProvider> - </Label> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label=""> - <Input - placeholder="" - className="mt-2" - type="number" - step="0.01" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="col-span-3 mt-4"> - <div className="flex items-center justify-between"> - <Label>공급처 선정</Label> - <Button - size={"sm"} - onClick={(e) => { }} - className="bg-none" - > - 후보지 조회 - </Button> - </div> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label=""> - <Input - placeholder="" - type="text" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? ""} - /> - </FormUi> - )} - /> - </div> - - <div className="col-span-4 mt-4"> - <div> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <FormUi label="공급관로 표준공사비(백만원)"> - <Input - placeholder="" - type="text" - step="0.001" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - value={field.value ?? 0} - /> - </FormUi> - )} - /> - </div> - <div className="mt-4"> - <Label>관로 표준공사비 산정 프로그램</Label> - <Button - size={"sm"} - onClick={(e) => { }} - className="bg-none" - > - 다운로드 - </Button> - </div> - <div className="col-span-4 mt-4 mb-3"> - <FormField - control={form.control} - name="" - render={({ field }) => ( - <Label className="text-xl">처리시설 + 공급관로 총사업비(백만원) - <FormUi label=""> - <Input - placeholder="" - type="text" - step="0.001" - onChange={(e) => { - field.onChange(Number(e.target.value)); - }} - readOnly={true} - value={field.value ?? 0} - /> - </FormUi> - </Label> - )} - /> - </div> - </div> - </div> - </Form> - </ScrollArea> - </ListDiv> + readOnly={true} + value={field.value ?? 0} + /> + </FormUi> + </Label> + )} + /> </div> - <UiModal - body={ - <> - <UiTable - headName={"용도에 따른 처리공정"} - tableData={[ - { usage: "청소", process: "총인처리시설 + 염소소독" }, - { usage: "화장실용수", process: "총인처리시설 + 염소소독" }, - { usage: "세척", process: "총인처리시설 + UV소독" }, - { usage: "살수", process: "총인처리시설 + UV소독" }, - { usage: "조경", process: "총인처리시설 + UV소독" }, - { usage: "농업", process: "총인처리시설 + UV소독" }, - { usage: "하천", process: "총인처리시설 + UV소독" }, - { usage: "지하수", process: "전처리시설 + RO" }, - { usage: "공업용수", process: "전처리시설 + RO" }, - - ]} - headlist={[ - { id: "usage", title: "용도" }, - { id: "process", title: "단위공정" } - ]} - pageSize={0} - total={0} - cellClick={() => { }} - onPageChange={() => { }} - /> - </> - } - bodyClass="w-[25vw] max-w-none h-[60vh]" - open={isPrcsMo.isModal} - onOpenChange={(open) => { - setIsPrcsMo({ isModal: open }); - }} - /> - <UiModal - body={ - <CoMatModal data={[]}></CoMatModal> - } - bodyClass="w-[40vw] max-w-none h-[70vh]" - open={isTrfMo.isModal} - onOpenChange={(open) => { - setIsTrfMo({ isModal: open }); - }} - /> - <UiModal - body={ - <CmpttnModal data={[]}></CmpttnModal> - } - bodyClass="w-[70vw] max-w-none h-[50vh]" - open={isCmpttnMo.isModal} - onOpenChange={(open) => { - setIsCmpttnMo({ isModal: open }); - }} - /> + </div> </div> - </ContentsDiv > - </> - ) -} \ No newline at end of file + </Form> + </ListDiv> + </ScrollArea> + </div> + <UiModal + body={ + <> + <UiTable + headName={"용도에 따른 처리공정"} + tableData={[ + { usage: "청소", process: "총인처리시설 + 염소소독" }, + { usage: "화장실용수", process: "총인처리시설 + 염소소독" }, + { usage: "세척", process: "총인처리시설 + UV소독" }, + { usage: "살수", process: "총인처리시설 + UV소독" }, + { usage: "조경", process: "총인처리시설 + UV소독" }, + { usage: "농업", process: "총인처리시설 + UV소독" }, + { usage: "하천", process: "총인처리시설 + UV소독" }, + { usage: "지하수", process: "전처리시설 + RO" }, + { usage: "공업용수", process: "전처리시설 + RO" }, + ]} + headlist={[ + { id: "usage", title: "용도" }, + { id: "process", title: "단위공정" }, + ]} + pageSize={0} + total={0} + cellClick={() => {}} + onPageChange={() => {}} + /> + </> + } + bodyClass="w-[25vw] max-w-none h-[60vh]" + open={isPrcsMo.isModal} + onOpenChange={(open) => { + setIsPrcsMo({ isModal: open }); + }} + /> + <UiModal + body={<CoMatModal data={[]}></CoMatModal>} + bodyClass="w-[40vw] max-w-none h-[70vh]" + open={isTrfMo.isModal} + onOpenChange={(open) => { + setIsTrfMo({ isModal: open }); + }} + /> + <UiModal + body={<CmpttnModal data={[]}></CmpttnModal>} + bodyClass="w-[70vw] max-w-none h-[50vh]" + open={isCmpttnMo.isModal} + onOpenChange={(open) => { + setIsCmpttnMo({ isModal: open }); + }} + /> + </div> + </ContentsDiv> + <Toaster position="top-center" /> + </> + ); +} diff --git a/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx b/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx index a8f6efc3f..f500c2479 100644 --- a/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx @@ -11,6 +11,7 @@ import ListDiv from "@common/business_components/ui/list_div"; import { Button, Label, Table, TableBody, TableHeader } from "@common/components/ui"; import { useEffect, useRef, useState } from "react"; import { headMakeprfmnc } from "../../prfmncReg/chkgdnReg/TableHead"; +import toast, { Toaster } from "react-hot-toast"; @@ -587,10 +588,10 @@ export default function PbnstPrfmncSttn() { const fromNum = Number(fromDate); const toNum = Number(toDate); if (fromNum > toNum) { - alert("시작년도가 종료년도 이후로 설정할 수 없습니다."); + toast.error("시작년도가 종료년도 이후로 설정할 수 없습니다."); } else { if (toNum - fromNum > 5) { - alert("최대 5년까지 선택 가능합니다."); + toast.error("최대 5년까지 선택 가능합니다."); } else { tableHeadMaker(fromNum, toNum); @@ -679,6 +680,7 @@ export default function PbnstPrfmncSttn() { </div> </div> </ContentsDiv> + <Toaster position="top-center"/> </> ) } diff --git a/apps/wr/app/store/matDmd/coMatRvw/headList.tsx b/apps/wr/app/store/matDmd/coMatRvw/headList.tsx index 8caf7e1b2..571deb001 100644 --- a/apps/wr/app/store/matDmd/coMatRvw/headList.tsx +++ b/apps/wr/app/store/matDmd/coMatRvw/headList.tsx @@ -11,27 +11,27 @@ export const sttnHeadListType = z.array( export const coRvwHeadListExport: z.infer<typeof sttnHeadListType> = [ { - id: "ctpv", + id: "cityText", title: "시도", visible: true, }, { - id: "sgg", + id: "sggText", title: "시군구", visible: true, }, { - id: "coNm", + id: "dmdCoNm", title: "회사명", visible: true, }, { - id: "addr", + id: "daddr", title: "공장주소", visible: true, }, { - id: "telNo", + id: "telno", title: "전화번호", visible: true, }, diff --git a/apps/wr/app/store/matDmd/coMatRvw/index.tsx b/apps/wr/app/store/matDmd/coMatRvw/index.tsx index 906a7bedd..31d818ba5 100644 --- a/apps/wr/app/store/matDmd/coMatRvw/index.tsx +++ b/apps/wr/app/store/matDmd/coMatRvw/index.tsx @@ -2,6 +2,8 @@ import type { z } from "zod"; import type { sttnHeadListType } from "../coSttn/headList"; import { coRvwHeadListExport, coRvwNodeListExport } from "./headList"; import type { CommonTableProps } from "../../common/type/header"; +import type { DmdCoReqType } from "./type"; +import { fetchType, getFetch } from "@/components/lib/api"; const coRvwHeadList = coRvwHeadListExport; const coRvwNodeList = coRvwNodeListExport; @@ -9,26 +11,54 @@ const coRvwNodeList = coRvwNodeListExport; export type coRvwState = { coRvw: { isInit: boolean; - coRvwHeadList: z.infer<typeof sttnHeadListType>; + coMatRvwRes: DmdCoReqType[]; + coRvwHeadList: CommonTableProps[]; coRvwNodeList: CommonTableProps[]; - }; }; export const coRvwStateExport: coRvwState = { coRvw: { isInit: false, + coMatRvwRes: [], coRvwHeadList: coRvwHeadList, coRvwNodeList: coRvwNodeList, - } -} + }, +}; export type coRvwType = coRvwState & coRvwActions; type coRvwActions = { + coMatRvwInit: ( + pageCnt: number, + pageNo: number, + sggCd: string, + startYear: string, + endYear: string + ) => void; }; export const coRvwActionsExport: (set: any) => coRvwActions = (set: any) => { return { - } -} \ No newline at end of file + coMatRvwInit: async ( + pageCnt: number, + pageNo: number, + sggCd: string, + startYear: string, + endYear: string + ) => { + const tempData = `/reuseFc/request/10000000000000`; + const url = `/reuseFc/request/${pageNo}/${pageCnt}/${sggCd}/${startYear}/${endYear}}`; + const coMatRvwRes = await getFetch(fetchType.WR, tempData); + + return set((state: coRvwState) => ({ + ...state, + coRvw: { + ...state.coRvw, + init: false, + coMatRvwRes: [coMatRvwRes], + }, + })); + }, + }; +}; diff --git a/apps/wr/app/store/matDmd/coMatRvw/type.tsx b/apps/wr/app/store/matDmd/coMatRvw/type.tsx new file mode 100644 index 000000000..eeaaaf8f5 --- /dev/null +++ b/apps/wr/app/store/matDmd/coMatRvw/type.tsx @@ -0,0 +1,70 @@ +import { z } from "zod"; +const DmdInfoSchema = z.object({ + dmdInfoSn: z.number(), + dmdInfoFk: z.string(), + dmndTmng: z.coerce.date(), + dmndQty: z.number(), + wntUntprc: z.number(), + grssClfg: z.number(), + combResdch: z.number(), + trbt: z.number(), + blgcOxygDmndQnt: z.number(), + smll: z.number(), + crmty: z.number(), + tn: z.number(), + tph: z.number(), + ph: z.number(), + clIonQnt: z.number(), + cdtnv: z.number(), + rmrk: z.string(), + useUsgCd: z.string(), +}); +const DmdMatSchema = z.object({ + dmdInfoFk: z.string(), + splyFcltFk: z.string(), + splyFcltFlg: z.string(), + pbnstRuseFcltBizFk: z.number(), + splyBgngDay: z.coerce.date(), + splyEndDay: z.coerce.date(), + splyCpct: z.number(), + splyFmYn: z.string(), + useUsgCd: z.string(), +}); + +export const DmdCoReqSchema = + z.object({ + cityText:z.string().nullish(), + sggText:z.string().nullish(), + dmdInfoPk: z.string(), + dmdCoNm: z.string(), + ctpvCd: z.string(), + sggCd: z.string(), + daddr: z.string(), + splyBgngDay: z.coerce.date(), + splyEndDay: z.coerce.date(), + splyCpct: z.number(), + splyFmYn: z.string(), + telno: z.string(), + useUsgCd: z.string(), + regDt: z.coerce.date(), + rgtr: z.string(), + mdfcnDt: z.coerce.date(), + mdfr: z.string(), + dmdAplyPswd: z.string(), + demandInfo: z.array(DmdInfoSchema), + demandMatchings: z.array(DmdMatSchema), + }) + + + + +export type DmdCoReqType = z.infer<typeof DmdCoReqSchema>; +export type DmdMatTableType = { + cityText:string, + sggText:string, + dmdCoNm:string, + daddr:string, + telno:string, + regDt:string, + state:string +} \ No newline at end of file diff --git a/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegForm.tsx b/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegForm.tsx index bac6c6e38..66acb0bf8 100644 --- a/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegForm.tsx +++ b/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/mngRegForm.tsx @@ -9,7 +9,6 @@ import { } from "@common/business_components/ui"; import { Form, FormField } from "@common/business_components/ui/form"; import { Button, Input } from "@common/components"; -import { zodResolver } from "@hookform/resolvers/zod"; import { useEffect, useRef, useState } from "react"; import { useFieldArray, useForm, type UseFormReturn } from "react-hook-form"; import { z } from "zod"; @@ -19,12 +18,10 @@ import { formTableName, } from "@/components/lib/class/comClass"; import { TusClientUpload } from "@/components/lib/useTus_wr/useTusWr"; -import RuseMngTable from "@/components/ui/table/pbnstReg/ruseMngTable/ruseMngTable"; import { pbnstRegZod, type customPbnst, type fcFileType, - type operType, type PbnstRegArrrayType, type selectLabel, } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type"; diff --git a/apps/wr/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal.tsx b/apps/wr/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal.tsx index 3d0eed82f..f60fb8620 100644 --- a/apps/wr/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal.tsx +++ b/apps/wr/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal.tsx @@ -10,7 +10,6 @@ import { useEffect, useState } from "react"; import { getCity, tableData } from "@/components/lib/func/commom"; import type { customRswtBdst } from "@/app/store/ruseFcltMng/fcltReg/rswtReg"; import type { customHtdflBdst } from "@/app/store/ruseFcltMng/fcltReg/htdflReg"; -import { headMakeColSpan } from "@/app/ruseFcltMng/fcltReg/rainReg/TableHead"; import RainRegForm from "@/components/ui/form/fcltReg/rainReg/rainRegForm"; import RswtrRegForm from "@/components/ui/form/fcltReg/rswtrReg/rswtrRegForm"; import HtdflRegForm from "@/components/ui/form/fcltReg/htdflReg/htdflRegForm"; diff --git a/apps/wr/components/ui/modal/fcltReg/fcOrgwtsRegModal/fcOrgwtsRegModal.tsx b/apps/wr/components/ui/modal/fcltReg/fcOrgwtsRegModal/fcOrgwtsRegModal.tsx index a6dd7bf2d..92b40e146 100644 --- a/apps/wr/components/ui/modal/fcltReg/fcOrgwtsRegModal/fcOrgwtsRegModal.tsx +++ b/apps/wr/components/ui/modal/fcltReg/fcOrgwtsRegModal/fcOrgwtsRegModal.tsx @@ -10,7 +10,6 @@ import { Button } from "@common/business_components/ui/table/lib/button"; import { Input } from "@common/components/ui"; import { ArrowLeft, ArrowRight } from "lucide-react"; import { useEffect, useRef, useState } from "react"; -import { useFieldArray } from "react-hook-form"; export default function FcOrgwtsRegModal({ onRightSet, closeModal }: { onRightSet?: (rightData:fcOrgwtType[]) => void,closeModal?:(val:boolean) =>void }) { const { code, pbnst, getSwtrmtFcltNm, searchFclts } = useWrStore((state) => state);