From 60bc81b46265c674044cbac76be98d1cf5e0c3b2 Mon Sep 17 00:00:00 2001 From: leedj312 Date: Thu, 26 Jun 2025 10:06:20 +0900 Subject: [PATCH] =?UTF-8?q?=ED=95=98=EC=88=98=EC=9E=AC=EC=9D=B4=EC=9A=A9?= =?UTF-8?q?=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx | 2 +- .../ruseFcltMng/fcltSttn/pbnstSttn/page.tsx | 103 +++++++------- .../store/prfmncReg/pbnstPrfmncReg/index.tsx | 56 ++++---- .../ruseFcltMng/fcltReg/rainReg/index.tsx | 131 ++++++++++-------- .../ruseFcltMng/fcltSttn/pbnstSttn/index.tsx | 5 +- .../ui/form/fcltReg/rainReg/rainRegForm.tsx | 12 +- 6 files changed, 159 insertions(+), 150 deletions(-) diff --git a/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx b/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx index 4950ab0da..e8146b37a 100644 --- a/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx +++ b/apps/wr/app/matMng/coMat/ruseCaseMng/page.tsx @@ -105,7 +105,7 @@ export default function RuseCaseMng() {
- + ( String(new Date().getFullYear()) ); - const [pageNation, setPageNation] = useState(1); const [isChHead, setIsChHead] = useState(false); const [bdstTable, setBdstTable] = useState(); const [pbnDetaileData, setPbnDetaileData] = useState<{ @@ -87,14 +79,17 @@ export default function PbnstSttn() { } }, [pbnstSttn.isInit, pbnSttnInit, ref.current]); useEffect(() => { - setBdstTable(pbnstSttn.pbnstSttnRes); }, [pbnstSttn.pbnstSttnRes]); - useEffect(() => { - if (pbnRuseNm.length > 1) - pbnNmSearch("1", "23", ref.current, pbnRuseNm, searchYear); - }, [pbnRuseNm]); + // useEffect(() => { + // pbnstSttnSearch("1", "20", ref.current, pbnRuseNm, searchYear); + // }, [pageNation, ref.current, pbnRuseNm, searchYear, pbnstSttnSearch]); + + // useEffect(() => { + // if (pbnRuseNm.length > 1) + // pbnNmSearch(String(pageNation), "23", ref.current, pbnRuseNm, searchYear); + // }, [pbnRuseNm,pageNation]); useEffect(() => { if (pbnstSttn.pbnstDetail.pbnstRuseFcltPk) @@ -104,15 +99,14 @@ export default function PbnstSttn() { }); }, [pbnstSttn.pbnstDetail]); - - useEffect(() => { - console.log('pbnDetaileData.isModal ', pbnDetaileData.isModal) -},[pbnDetaileData.isModal]) + useEffect(() => { + console.log("pbnDetaileData.isModal ", pbnDetaileData.isModal); + }, [pbnDetaileData.isModal]); return ( <> -
-
+
+
<SearchBaseForm selectSidoData={code.cityCd} @@ -132,41 +126,32 @@ export default function PbnstSttn() { </Button> } leftChildren={ - <> - <div className="flex flex-row space-x-2"> - <SelectBox - className="w-48 h-full text-2xl" - label="연도" - selectClass={""} - selectArray={yearOptions} - value={searchYear} - onSelectValue={(val: string | number) => - setSearchYear(String(val)) - } - /> - </div> - <SearchInputText - label={"하수처리시설"} - initValue={pbnRuseNm ?? ""} - setValue={(searchNm?: string) => { - setPbnRuseNm(searchNm || ""); - }} - setRtnData={function (rtnData: any[]): void { - setBdstTable(rtnData); - }} - searchList={pbnstSttn.pbnstSearchData || []} - ></SearchInputText> - </> + <div className="col-span-3 flex items-center"> + <SelectBox + className="w-48 h-full text-2xl" + label="연도" + selectClass={"w-full "} + selectArray={yearOptions} + value={searchYear} + onSelectValue={(val: string | number) => + setSearchYear(String(val)) + } + /> + <Label className="w-64 mt-2 mx-4 text-xl text-gray-600"> + {"하수처리시설명 "} + </Label> + <SearchInput + className={"text-2xl w-full ㅍ"} + label="" + textValue={pbnRuseNm || ""} + setText={(e) => { + setPbnRuseNm(e || ""); + }} + /> + </div> } queryClick={function (returnType: ReturnType): void { - // '{partValue: 'A', sidoValue: '0', sigunValue: '0', regionValue: '0', unitWaterShedValue: '0', …}' - let con; - if (returnType.sigunValue != "0") { - con = returnType.sigunValue; - } else { - con = returnType.sidoValue; - } - // pbnstSttnSearch(1, "20", con); + pbnstSttnSearch("1", "20", returnType, pbnRuseNm, searchYear); }} excelClick={excelClick} initClick={function (): void {}} @@ -191,7 +176,15 @@ export default function PbnstSttn() { cellClick={(index: number | undefined, headId: string) => { cellCLick(index); }} - onPageChange={setPageNation} + onPageChange={(page: number) => { + pbnstSttnSearch( + String(page), + String(13), + ref.current, + pbnRuseNm, + searchYear + ); + }} ></UiTable> </ListDiv> </div> diff --git a/apps/wr/app/store/prfmncReg/pbnstPrfmncReg/index.tsx b/apps/wr/app/store/prfmncReg/pbnstPrfmncReg/index.tsx index 37c010890..87e827f60 100644 --- a/apps/wr/app/store/prfmncReg/pbnstPrfmncReg/index.tsx +++ b/apps/wr/app/store/prfmncReg/pbnstPrfmncReg/index.tsx @@ -33,7 +33,7 @@ export type pbnstPrfmncType = pbnstPrfmncState & pbnstPrfmncActions; type pbnstPrfmncActions = { prfmncHasuInit: (page: string, sggOrCity: string) => void; - prfmnRegData: (data:PrfType) =>void + prfmnRegData: (data: PrfType) => void; }; const checkWrRegList = async () => { @@ -47,21 +47,28 @@ const hasuListFetch = async (page: string, sggOrCity: string) => { checkWrRegListRes?.fcltCds, fetchType.COMMON ); - const data = checkWrRegListRes.fcPrfList.map((item: FcPrfType) => { - const findData = rainRes.data.find( - (fclt: pubHasuType) => - fclt.bscFctCd === item.pbnstRuseFcltPk.substring(0, 11) + + + const findData = rainRes.data.map((item: pubHasuType) => { + const data = checkWrRegListRes?.fcPrfList.find( + (fclt: FcPrfType) => + fclt.pbnstRuseFcltPk.substring(0, 11) === item?.bscFctCd ); - return { - sido: findData?.sido, - gugun: findData?.gugun, - bscFctNm: findData?.bscFctNm, - ruseUtztnFcltNm: item.ruseUtztnFcltNm, - pbnstRuseFcltPk: item.pbnstRuseFcltPk, - prfList : item.prfList - }; + if(data !==undefined){ + return( { + + sido: item.sido, + gugun: item.gugun, + bscFctNm: item.bscFctNm, + bscFctCd: item.bscFctCd, + ruseUtztnFcltNm: data.ruseUtztnFcltNm, + pbnstRuseFcltPk: data.pbnstRuseFcltPk, + prfList: data.prfList, + }); + } }); - return data; + + return findData; }; export const pbnstPrfmncActionsExport: (set: any) => pbnstPrfmncActions = ( set: any @@ -83,26 +90,21 @@ export const pbnstPrfmncActionsExport: (set: any) => pbnstPrfmncActions = ( console.log(errorHasu); } }, - prfmnRegData: async (data:PrfType,) => { - try{ - + prfmnRegData: async (data: PrfType) => { + try { const ressponse = await postFectch( "/reuseFc/pubFcPrf", data, fetchType.WR ); - console.log('ressponse ', ressponse) - - if(ressponse.status === 200){ - - toast.success("하수재이용 시설 실적 등록이 완료되었습니다.") - - } - }catch(e){ - console.log(e) - toast.error("하수재이용 시설 실적 등록이 실패하였습니다.") + if (ressponse.status === 200) { + toast.success("하수재이용 시설 실적 등록이 완료되었습니다."); + } + } catch (e) { + console.log(e); + toast.error("하수재이용 시설 실적 등록이 실패하였습니다."); } }, }; diff --git a/apps/wr/app/store/ruseFcltMng/fcltReg/rainReg/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltReg/rainReg/index.tsx index d398b7f6e..5b3ad6813 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltReg/rainReg/index.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltReg/rainReg/index.tsx @@ -3,7 +3,76 @@ import { getFetch, postFectch, putFectch } from "@/components/lib/api"; import { z } from "zod"; import { makeMdfr, makeRstr } from "../bdstReg"; +const validationMessages = { + required: (field: string) => `${field}을(를) 입력해주세요.`, + requiredSelect: (field: string) => `${field}을(를) 선택해주세요.`, + yearFormat: '4자리 연도만 입력하세요', +}; + export const TEST_UUID= '2d4b151d-1828-41e0-91d9-4cd28ea1cc7e' + +const rainyObjSchema = z.object({ + bdstReuseFcltFk: z.number().nullish(), + pntfColKnd: z.string().default(""), + pntfColArea: z.number().default(0), + dtfcltCpct: z.number().default(0), + filtrTrtmfctYn: z.string().default("Y").nullish(), + filtrTrtmfctCpct: z.number().nullish().default(0), + filtrTrtmfctPrs: z.string().default(""), + annRnwtQty: z.number().default(0), + oilqMeasMthd: z.string().default("").nullish(), + rgtr:z.string().nullish(), + mdfr:z.string().nullish(), +}).refine((data) => data.pntfColKnd.length > 0, { + message: validationMessages.requiredSelect("종류"), + path: ["pntfColKnd"], +}).refine((data) => data.pntfColArea > 0, { + message: validationMessages.required("면적(m³)"), + path: ["pntfColArea"], +}); + +const reuseBuildingSchema = z.object({ + bdstRuseFcltPk: z.number().nullish(), + bdstInfoFk:z.number().nullish(), + instlCmptnDt: z.coerce.date().default(() => new Date()), + instlCst: z.number().nullish(), + operMngCd: z.string().optional().default(""), + anlOperCst: z.number().default(0), + instlCstSprtYn: z.string().default("Y"), + instlCstSprtAmt: z.number().nullish(), + grntchBdstCertYn: z.string().default("Y"), + grntchBdstCertYr: z.string().default("") + .refine((year)=> year.length===0 || /^\d{4}$/.test(year),{ + message: validationMessages.yearFormat + }), + grntchBdstCertNo: z.string().default(""), + grntchBdstCertGrd: z.string().default(""), + crgRdctYn: z.string().default("N").nullish(), /// 안쓰는 값 + crgRdctBss: z.string().default("").nullish(), /// 안쓰는 값 + crgRdctAmt: z.number().default(0), // 안쓰는 값 + ruseFcltFlg: z.string().default(""), + bdstUsgCd: z.number().default(0), + lawTrgtYn: z.string().default("Y"), + rgtr:z.string().nullish(), + mdfr:z.string().nullish(), + rainyObj: rainyObjSchema.default({}) +}).refine((data) => data.bdstUsgCd > 0, { + message: validationMessages.requiredSelect("건축물용도"), + path: ["bdstUsgCd"], +}); + +const chgBuildingSchema = z.object({ + bdstInfoFk: z.number().nullish(), + archChgPrmsnDt: z.coerce.date({required_error: validationMessages.required("허가일")}), + archChgArea: z.string().default("-"), + bdstChgNm: z.string().default(""), + rgtr:z.string().nullish(), + mdfr:z.string().nullish(), +}).refine(data => data.bdstChgNm.length > 0, { + message: validationMessages.requiredSelect("구분"), + path: ["bdstChgNm"] +}); + export const rainZod = z.object({ bdstInfoPk: z.number().optional(), ctpvCd: z.number().default(0), @@ -16,62 +85,9 @@ export const rainZod = z.object({ archChgArea: z.number().default(0), rgtr:z.string().nullish(), mdfr:z.string().nullish(), - reuseBuilding: z.array( - z.object({ - bdstRuseFcltPk: z.number().nullish(), - bdstInfoFk:z.number().nullish(), - instlCmptnDt: z.coerce.date().default(() => new Date()), - instlCst: z.number().nullish(), - operMngCd: z.string().optional().default(""), - anlOperCst: z.number().default(0), - instlCstSprtYn: z.string().default(""), - instlCstSprtAmt: z.number().nullish(), - grntchBdstCertYn: z.enum(["Y", "N"]).nullish(), - grntchBdstCertYr: z.string().default("") - .refine((year)=> year.length===0 || /^\d{4}$/.test(year),{ - message:'4자리 연도만 입력하세요' - }), - grntchBdstCertNo: z.string().default(""), - grntchBdstCertGrd: z.string().default(""), - crgRdctYn: z.string().default("N").nullish(), /// 안쓰는 값 - crgRdctBss: z.string().default("").nullish(), /// 안쓰는 값 - crgRdctAmt: z.number().default(0), // 안쓰는 값 - ruseFcltFlg: z.string().default(""), - bdstUsgCd: z.number().default(0), - lawTrgtYn: z.enum(["Y", "N"]), - rgtr:z.string().nullish(), - mdfr:z.string().nullish(), - - rainyObj: z.object({ - bdstReuseFcltFk: z.number().nullish(), - pntfColKnd: z.string().default(""), - pntfColArea: z.number().default(0), - dtfcltCpct: z.number().default(0), - filtrTrtmfctYn: z.enum(["Y", "N"]).nullish(), - filtrTrtmfctCpct: z.number().nullish().default(0), - filtrTrtmfctPrs: z.string().default(""), - annRnwtQty: z.number().default(0), - oilqMeasMthd: z.string().default("").nullish(), - rgtr:z.string().nullish(), - mdfr:z.string().nullish(), - - - }).default({}) - }) - ).default([]), - - chgBuilding: z.array( - z.object({ - bdstInfoFk: z.number().nullish(), - archChgPrmsnDt: z.coerce.date(), - archChgArea: z.string().default("-"), - bdstChgNm: z.string().default(""), - rgtr:z.string().nullish(), - mdfr:z.string().nullish(), - - }) - ).default([]) -}); + reuseBuilding: z.array(reuseBuildingSchema).default([]), + chgBuilding: z.array(chgBuildingSchema).default([]) +}) export type chgBuilding={ bdstInfoFk?: number|null, @@ -254,6 +270,3 @@ export const rainFacActionsExport: (set: any) => rainFacSActions = ( } }} - - - diff --git a/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx index 6ce27db86..33bce5520 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx @@ -9,6 +9,7 @@ import { excelPbnstSttnParsing } from "./excel"; import type { FcPrfType } from "@/app/store/prfmncReg/pbnstPrfmncReg/type"; import type { ReturnType } from "@common/business_components/ui"; import type { WaterReuseFacility } from "./type"; +import moment from "moment"; const pbnstSttHeadList = pbnSttHeadListExport; const pbnstSttNodeList = pbnstSttNodeListExport; @@ -166,8 +167,8 @@ const hasuListFetch = async ( outUsage: usage.outUsage, operMthd: item.operList[0]?.operMthd, rprtvBzenty: item.operList[0]?.rprtvBzenty, - bgngDt: item.operList[0]?.bgngDt.toLocaleDateString ?? "", - endDt: item.operList[0]?.endDt.toLocaleDateString?? "", + bgngDt: moment(item.operList[0]?.bgngDt).format("YYYY-MM-DD") ?? "", + endDt: moment(item.operList[0]?.endDt).format("YYYY-MM-DD") ?? "", searchNm: findData.bscFctNm, searchPk: findData.bscFctCd, prfList:item?.prfList??[] diff --git a/apps/wr/components/ui/form/fcltReg/rainReg/rainRegForm.tsx b/apps/wr/components/ui/form/fcltReg/rainReg/rainRegForm.tsx index 08f2b073e..9ec4fc5c0 100644 --- a/apps/wr/components/ui/form/fcltReg/rainReg/rainRegForm.tsx +++ b/apps/wr/components/ui/form/fcltReg/rainReg/rainRegForm.tsx @@ -60,8 +60,10 @@ export default function RainRegForm({ typeof item?.grntchBdstCertYr === "string" ? item?.grntchBdstCertYr : "", // null → "" + // Ensure enum fields are null if empty string to trigger Zod default rainyObj: { ...item?.rainyObj, + filtrTrtmfctYn: item?.rainyObj?.filtrTrtmfctYn === "" ? null : item?.rainyObj?.filtrTrtmfctYn, }, })), }; @@ -243,7 +245,7 @@ export default function RainRegForm({ label={""} selectArray={code.yn} onSelectValue={readonly ? () => { } : field.onChange} - value={field.value ?? code.yn[0]?.val} + value={field.value || code.yn[0]?.val} readOnly={readonly} /> </FormUi> @@ -278,12 +280,10 @@ export default function RainRegForm({ <FormUi label="처리공정"> <Input className={selectClass} - placeholder="1,000,000" - type="" + placeholder="" + type="text" value={field.value ?? ""} - onChange={(e) => { - if (!readonly) handleCommaNumberChange(e, field.onChange); - }} + onChange={field.onChange} readOnly={filtrTrtmfctYn !== "Y"} /> </FormUi>