From 2e1fa426a84befeef64d5b1e3babfc8520e30c5d Mon Sep 17 00:00:00 2001 From: leedj312 Date: Wed, 7 May 2025 18:20:48 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A4=91=EC=88=98=EB=8F=84=20=EC=8B=9C?= =?UTF-8?q?=EC=84=A4=20=ED=98=84=ED=99=A9=20=ED=8C=9D=EC=97=85=EC=B0=BD?= =?UTF-8?q?=EB=A7=8C=20=EB=82=A8=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ruseFcltMng/fcltReg/htdflReg/page.tsx | 31 +++- .../ruseFcltMng/fcltSttn/rainSttn/page.tsx | 113 ++++++------- .../ruseFcltMng/fcltSttn/rswtSttn/page.tsx | 157 ++++++++++++++++++ .../ruseFcltMng/prfmncReg/chkgdnReg/page.tsx | 6 +- .../prfmncReg/chkgdnReg/rainChkgdn/index.tsx | 10 +- .../ruseFcltMng/fcltReg/htdflReg/index.tsx | 93 +++++++---- .../ruseFcltMng/fcltReg/rswtReg/index.tsx | 6 +- .../ruseFcltMng/fcltSttn/rainSttn/excel.tsx | 3 +- .../ui/form/fcltReg/htdflReg/htdflRegForm.tsx | 15 +- .../ui/modal/headChModal/headChModal.tsx | 36 ++-- apps/wr/public/sample_rswtSttn.xlsx | Bin 0 -> 9159 bytes 11 files changed, 324 insertions(+), 146 deletions(-) create mode 100644 apps/wr/app/ruseFcltMng/fcltSttn/rswtSttn/page.tsx create mode 100644 apps/wr/public/sample_rswtSttn.xlsx diff --git a/apps/wr/app/ruseFcltMng/fcltReg/htdflReg/page.tsx b/apps/wr/app/ruseFcltMng/fcltReg/htdflReg/page.tsx index b252121dc..956f7dc84 100644 --- a/apps/wr/app/ruseFcltMng/fcltReg/htdflReg/page.tsx +++ b/apps/wr/app/ruseFcltMng/fcltReg/htdflReg/page.tsx @@ -24,9 +24,10 @@ import type { customHtdflBdst } from "@/app/store/ruseFcltMng/fcltReg/htdflReg"; import { headMakeColSpan } from "../rainReg/TableHead"; export default function Home() { - const { code, htdfl, initHtdfl } = useWrStore((state) => state); - const nodeList = headMakeColSpan(htdfl.upHeadList); + const { code, htdfl, initHtdfl,getHtdflBdstData } = useWrStore((state) => state); const [searchTxt, setSearchTxt] = useState(""); + const [pageNation, setPageNation] = useState(1); + const [htdflForm, setHtdflForm] = useState(); const [bdstTable, setbdstTable] = useState(); const [issNewReg,setIsNewReg] = useState( false); @@ -40,13 +41,23 @@ export default function Home() { useEffect(() => { if (!htdfl.isInit) { - initHtdfl(undefined); + initHtdfl('41'); } }, [htdfl.isInit, initHtdfl]); useEffect(() => { if (code.sggCd.length > 0) { - setbdstTable(tableData(htdflRes, { code })); + + const htdflData = tableData(htdflRes, { code }).map( + (item: customHtdflBdst) => { + return { + ...item, + bdstChgYn: item.chgBuilding.length > 0 ? "Y" : "N", + bdstUsgCd: item.reuseBuilding[0]?.bdstUsgCd + }; + } + ); + setbdstTable(htdflData); } }, [code, htdflRes]); @@ -64,13 +75,17 @@ export default function Home() { htdflRes[val]?.bdstInfoPk != null && htdflRes[val]?.chgBuilding?.length > 0 ) { - bdstChgModal(htdflRes[val]?.chgBuilding); + bdstChgModal(htdflRes[val]?.chgBuilding as chgBuilding[]); } } }; const bdstChgModal = (chgBuilding: chgBuilding[]) => { setBdstChgProps({ isOpen: true, chgBuilding: chgBuilding }); }; + useEffect(() => { + getHtdflBdstData(pageNation, "41"); + }, [pageNation]); + return ( <> @@ -112,9 +127,9 @@ export default function Home() { pageSize={100} total={10} headName={"○건축물 목록"} - cellClick={(val,headId)=>{cellClick(val||undefined , headId)}} - > - {nodeList} + cellClick={(val, headId) => { cellClick(val || undefined, headId); } } + onPageChange={setPageNation} + > diff --git a/apps/wr/app/ruseFcltMng/fcltSttn/rainSttn/page.tsx b/apps/wr/app/ruseFcltMng/fcltSttn/rainSttn/page.tsx index b537fcfcc..7bfcc29b0 100644 --- a/apps/wr/app/ruseFcltMng/fcltSttn/rainSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/fcltSttn/rainSttn/page.tsx @@ -2,7 +2,11 @@ "use client"; import { useWrStore } from "@/app/store"; import { btnClass } from "@/app/store/common/code"; -import { excelDownload, tableData } from "@/components/lib/func/commom"; +import { + excelDownload, + getCityOrSgg, + tableData, +} from "@/components/lib/func/commom"; import HeadChModal from "@/components/ui/modal/headChModal/headChModal"; import { ContentsDiv, @@ -10,7 +14,7 @@ import { Title, UiModal, UiTable, - type ReturnType + type ReturnType, } from "@common/business_components/ui"; import ListDiv from "@common/business_components/ui/list_div"; import { Button } from "@common/components/ui"; @@ -19,50 +23,32 @@ import type { customRainBdst } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import { HeadMakeColSpan } from "@common/business_components/ui/table/HeadMakeColSpan"; export default function RainSttn() { - const { code, rainSttn, rainSttnSearch } = - useWrStore((state) => state); + const { code, rainSttn, rainSttnSearch, rainSttnInit } = useWrStore( + (state) => state + ); + + const [pageNation, setPageNation] = useState(1); const { rainSttnRes } = rainSttn; const [isChHead, setIsChHead] = useState(false); const ref = useRef({} as ReturnType); const [bdstTable, setBdstTable] = useState(); + const codeData = getCityOrSgg(ref); + useEffect(() => { if (!rainSttn.isInit) { - let con - if (ref.current.sigunValue != '0') { - con = ref.current.sigunValue - }else{ - con = ref.current.sidoValue - } - rainSttnSearch('1', '20' ,con); + rainSttnInit(codeData ?? "0"); } - }, [rainSttn.isInit, rainSttnSearch]); - + }, [rainSttn.isInit, rainSttnInit]); useEffect(() => { - - if (rainSttnRes.length > 0 && code.cityCd.length>0) { + if (rainSttnRes.length > 0 && code.cityCd.length > 0) { const data = tableData(rainSttnRes, { code }); const chData = data .map((item: any) => ({ - ...item, ...item.reuseBuilding[0], ...item.reuseBuilding[0].rainyObj, - // cityText:item.cityText, - // sggText:item.sggText, - // bdstNm: item.bdstNm, - // daddr:item.daddr, - // bdstUsgCd:item.bdstUsgCd, - // frstArchPrmsnDt:item.frstArchPrmsnDt, - // archArea:item.archArea, - // lawTrgtYn:item.lawTrgtYn, - // instlCmptnDt:item.instlCmptnDt, - // instlCst:item.instlCst, - - - - })) .filter((item: any) => item.rainyObj !== undefined); @@ -70,29 +56,25 @@ export default function RainSttn() { } }, [code, rainSttnRes, rainSttn.rainSttHeadList]); - - useEffect(() =>{ -console.log(rainSttn.rainSttNodeList) - },[rainSttn.rainSttNodeList]) + useEffect(() => { + if (codeData != null) rainSttnSearch(pageNation, "20", codeData); + }, [pageNation]); useEffect(() => { - if(rainSttn.excelList.length>0){ - + if (rainSttn.excelList.length > 0) { if (rainSttn.excelList.length === 0) return; - excelDownload(rainSttn.excelList , '빗물재이용시설 현황','sample_rainSttn.xlsx') + excelDownload( + rainSttn.excelList, + "빗물재이용시설 현황", + "sample_rainSttn.xlsx" + ); } }, [rainSttn.excelList]); - - const excelClick = useCallback((returnType:ReturnType) => { - let con - if (returnType.sigunValue != '0') { - con = returnType.sigunValue - }else{ - con = returnType.sidoValue - } - rainSttnSearch('1', '10000' ,con); - },[rainSttnSearch]); + const excelClick = useCallback(() => { + if (codeData) rainSttnSearch(1, "10000", codeData); + }, [rainSttnSearch]); + return ( <> @@ -119,13 +101,13 @@ console.log(rainSttn.rainSttNodeList) leftChildren={undefined} 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 + let con; + if (returnType.sigunValue != "0") { + con = returnType.sigunValue; + } else { + con = returnType.sidoValue; } - rainSttnSearch('1', '20' ,con); + rainSttnSearch(1, "20", con); }} excelClick={excelClick} initClick={function (): void {}} @@ -140,16 +122,15 @@ console.log(rainSttn.rainSttNodeList) } + children={ + + } headlist={rainSttn.rainSttHeadList} - pageSize={0} - total={0} + pageSize={20} + total={100000} cellClick={undefined} - onPageChange={function (page: number): void { - throw new Error("Function not implemented."); - }} - > - + onPageChange={setPageNation} + > @@ -159,7 +140,15 @@ console.log(rainSttn.rainSttNodeList) setIsChHead(!isChHead); }} bodyClass={""} - body={} + body={ + ({ + ...item, + visible: item.visible ?? false, + }))} + /> + } /> diff --git a/apps/wr/app/ruseFcltMng/fcltSttn/rswtSttn/page.tsx b/apps/wr/app/ruseFcltMng/fcltSttn/rswtSttn/page.tsx new file mode 100644 index 000000000..73ea9b13a --- /dev/null +++ b/apps/wr/app/ruseFcltMng/fcltSttn/rswtSttn/page.tsx @@ -0,0 +1,157 @@ +"use client"; +import { useWrStore } from "@/app/store"; +import { btnClass } from "@/app/store/common/code"; +import type { customRswtBdst } from "@/app/store/ruseFcltMng/fcltReg/rswtReg"; +import { excelDownload, getCityOrSgg, tableData } from "@/components/lib/func/commom"; +import HeadChModal from "@/components/ui/modal/headChModal/headChModal"; +import { + ContentsDiv, + SearchBaseForm, + Title, + UiModal, + UiTable, + type ReturnType, +} from "@common/business_components/ui"; +import ListDiv from "@common/business_components/ui/list_div"; +import { HeadMakeColSpan } from "@common/business_components/ui/table/HeadMakeColSpan"; +import { Button } from "@common/components/ui"; +import { useCallback, useEffect, useRef, useState } from "react"; + +export default function RswtSttn() { + const { code, rswtSttn, rswtSttnSearch ,rswtSttnInit} = useWrStore((state) => state); + const [pageNation, setPageNation] = useState(1); + + const { rswtSttnRes } = rswtSttn; + const [isChHead, setIsChHead] = useState(false); + const ref = useRef({} as ReturnType); + const [bdstTable, setBdstTable] = useState(); + + const codeData = getCityOrSgg(ref); + + + useEffect(() => { + if (!rswtSttn.isInit) { + + rswtSttnInit('0') + } + }, [rswtSttn.isInit, rswtSttnInit]); + + useEffect(() => { + if (rswtSttnRes.length > 0 && code.cityCd.length > 0) { + const data = tableData(rswtSttnRes, { code }); + const chData = data + .map((item: customRswtBdst) => ({ + ...item, + ...item.reuseBuilding[0], + ...item.reuseBuilding[0]?.rswtrObj, + chBuildingYn:item.chgBuilding.length>0?'Y':'N' + })) + .filter((item: customRswtBdst) => item.reuseBuilding[0]?.rswtrObj !== undefined); + + console.log("chData ", chData) + setBdstTable(chData); + } + }, [code, rswtSttnRes]); + + + useEffect(() => { + if (rswtSttn.excelList.length > 0) { + if (rswtSttn.excelList.length === 0) return; + excelDownload( + rswtSttn.excelList, + "중수도시설 현황", + "sample_rswtSttn.xlsx" + ); + } + }, [rswtSttn.excelList]); + + const excelClick = useCallback( + (returnType: ReturnType) => { + let con; + if (returnType.sigunValue != "0") { + con = returnType.sigunValue; + } else { + con = returnType.sidoValue; + } + rswtSttnSearch(1, "10000", con); + }, + [rswtSttnSearch] + ); + + useEffect(() => { + if (codeData != null) rswtSttnSearch(pageNation, "20", codeData); + }, [pageNation]); + + + return ( + <> + +
+
+ + <SearchBaseForm + selectSidoData={code.cityCd} + selectSigunData={code.sggCd} + selectRegionData={code.rvbsnCd} + selectUnitWaterShedData={code.lgbsnCd} + selectMiddleRegionData={code.mdmbsnCd} + selectEnvPartData={code.lclgvrnmntCd} + rightChildren={ + <Button + className={btnClass} + onClick={() => { + setIsChHead(true); + }} + > + 조회항목설정 + </Button> + } + leftChildren={undefined} + 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; + } + rswtSttnSearch(1, "20", con); + }} + excelClick={excelClick} + initClick={function (): void {}} + btnClass={btnClass} + ref={ref} + /> + </div> + </div> + <div className="grid grid-cols-6 gap-4 "> + <div className="col-span-6"> + <ListDiv> + <UiTable + headName={[]} + tableData={bdstTable || []} + children={ + <HeadMakeColSpan upHeadList={rswtSttn.rswtSttNodeList} /> + } + headlist={rswtSttn.rswtSttHeadList} + pageSize={20} + total={10000} + cellClick={undefined} + onPageChange={setPageNation} + + ></UiTable> + </ListDiv> + </div> + </div> + <UiModal + open={isChHead} + onOpenChange={() => { + setIsChHead(!isChHead); + }} + bodyClass={""} + body={<HeadChModal headList={(rswtSttn.rswtSttHeadList||[]).map(item => ({ ...item, visible: item.visible ?? false }))} type={"RST"} />} + /> + </ContentsDiv> + </> + ); +} diff --git a/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx b/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx index fc8fb1e0a..2e8b4ee48 100644 --- a/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx @@ -9,7 +9,6 @@ import { excelDownload } from "@/components/lib/func/commom"; import ChkgdExcel from "@/components/ui/modal/chkgdExcel/chkgdExcel"; import ChkgdModal from "@/components/ui/modal/chkgdModal/chkgdModal"; import RainChkgdTable from "@/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable"; -import RainChkgdTableModal from "@/components/ui/table/chkgdTable/rainChkgd/rainChkgdTableModal"; import RswtChkgdTable from "@/components/ui/table/chkgdTable/rswtChkgd/rswtChkgdTable"; import { ContentsDiv, @@ -61,6 +60,7 @@ export default function Page() { }, [rainChkgdn.excelList]); const excelClick= useCallback(()=>{ + rainChkExcelDownload(code.cityCd, code.sggCd); }, [rainChkExcelDownload, code.cityCd, code.sggCd]); @@ -72,9 +72,7 @@ export default function Page() { const clickDelete=(data:number[])=>{ if(data.length>0){ - data.forEach((data) =>{ - rainChkDelete( String(data) ) - }) + rainChkDelete( data ) } } diff --git a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx index 9f51eed50..ec3464ab8 100644 --- a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx +++ b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx @@ -313,7 +313,7 @@ type rainChkgdnActions = { rainChkGuidUpdate(rainChk: rainChkZodType): Promise<void>; rainChkExcelDownload(sidoCode: SelectDataType[],sggCode: SelectDataType[]): Promise<void> rainChkExcelDataUPload(excelData:rainChkZodType[]) : Promise<void> - rainChkDelete(chkgdnPk:string) :Promise<void> + rainChkDelete( chkgdnPks:number[] ) :Promise<void> }; export type rainChkgdnType = rainChkgdnState & rainChkgdnActions; @@ -367,7 +367,9 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = ( ) => { return { rainChkExcelDownload:async(sidoCode:SelectDataType[], sggCode:SelectDataType[])=>{ - const data = await getFetch(fetchType.WR, "/reuseFc/building/RNB/0") + + // 로그인한 아이디의 시도 or 시군구로 들어가야하는데 현재는 그냥 0으로 하드코딩 + const data = await getFetch(fetchType.WR, `/reuseFc/buildingFlg/RNB/41`) // const excelList = buildingToExcelType(data, sidoCode, sggCode); const excelList = buildingToExcelType(data, sidoCode, sggCode); @@ -454,9 +456,9 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = ( }, - rainChkDelete: async (chkgdnPk:string) =>{ + rainChkDelete: async (chkgdnPks:number[] ) =>{ try{ - const res = await deleteFectch(`/reuseChk/rainy/${chkgdnPk}`,''); + const res = await deleteFectch(`/reuseChk/rainy`,chkgdnPks); if(res.ok){ ToastFormUi({body:"삭제가 완료되었습니다. " ,title:'지도점검 삭제'}) diff --git a/apps/wr/app/store/ruseFcltMng/fcltReg/htdflReg/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltReg/htdflReg/index.tsx index 2ac27be5a..80864d026 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltReg/htdflReg/index.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltReg/htdflReg/index.tsx @@ -25,21 +25,21 @@ export const hdtflZod = z.object({ instlCst: z.number().nullish().default(0), operMngCd: z.string().nullish().default(""), anlOperCst: z.number().default(0), - instlCstSprtYn: z.enum(["Y", "N"]), + instlCstSprtYn: z.enum(["Y", "N"]).nullish(), instlCstSprtAmt: z.number().nullish().default(0), - grntchBdstCertYn: z.enum(["Y", "N"]), - grntchBdstCertYr: z .string().default("") - .refine((year) =>year.length ===0 || /^\d{4}$/.test(year),{ - message:'4자리 연도만 입력하세요' - }), + // grntchBdstCertYn: z.enum(["Y", "N"]), + // grntchBdstCertYr: z .string().default("") + // .refine((year) =>year.length ===0 || /^\d{4}$/.test(year),{ + // message:'4자리 연도만 입력하세요' + // }), grntchBdstCertNo: z.string().nullish().default(""), grntchBdstCertGrd: z.string().nullish().default(""), - crgRdctYn: z.enum(["Y", "N"]), - crgRdctBss: z.string().nullish().default(""), - crgRdctAmt: z.number().nullish().default(0), - ruseFcltFlg: z.string().nullish().default(""), + // crgRdctYn: z.enum(["Y", "N"]), + // crgRdctBss: z.string().nullish().default(""), + // crgRdctAmt: z.number().nullish().default(0), + ruseFcltFlg: z.string().nullish().default(""), bdstUsgCd: z.number().default(0), - lawTrgtYn: z.enum(["Y", "N"]), + lawTrgtYn: z.enum(["Y", "N"]).nullish(), rgtr:z.string().nullish().default(null), mdfr:z.string().nullish().default(null), // htdflObj 매핑 @@ -49,13 +49,13 @@ export const hdtflZod = z.object({ bdstRuseFcltFk: z.number().nullish(), etgtType: z.string().default(""), fclCpct: z.number().default(0), - plwtYn: z.string().default(""), + plwtYn: z.enum(["Y", "N"]), orgwtWtritSpt: z.number().default(0), orgwtOcrnProcs: z.string().default(""), wtritEntrcTp: z.number().max(4, "온도는 100이상이 될 수 없습니다.") .default(0), amtgnr: z.number().default(0), - prcsProcsYn: z.string().default(""), + prcsProcsYn: z.enum(["Y", "N"]), prcsFcltCpct: z.number().default(0), fmYn: z.string().default(""), utztnCpct: z.number().default(0), @@ -75,7 +75,10 @@ export const hdtflZod = z.object({ rgtr:z.string().nullish().default(null), mdfr:z.string().nullish().default(null), }) - .default({}), + .default({ + plwtYn: "N", + prcsProcsYn: "N", + }), }) ) .default([]), @@ -84,7 +87,7 @@ export const hdtflZod = z.object({ z.object({ bdstInfoFk: z.number().nullish(), archChgPrmsnDt: z.coerce.date() , - archChgArea: z.string().default("-"), + archChgArea: z.string().default("-").nullish(), bdstChgNm: z.string().default(""), rgtr:z.string().nullish().default(null), mdfr:z.string().nullish().default(null), @@ -94,7 +97,6 @@ export const hdtflZod = z.object({ }); export type customHtdflBdst = z.infer<typeof hdtflZod> - //export type customHtdflBdst = z.infer<typeof hdtflZod>; export type htdflFacState = { @@ -105,9 +107,11 @@ export type htdflFacState = { }; }; type htdflFacSActions = { - initHtdfl: (txt: string | undefined) => void; - htdflUpdate:(data: customHtdflBdst) => void; - htdflReg:(data: customHtdflBdst) => void; + initHtdfl: (code: string | number) => void; + htdflBdstUpdate:(data: customHtdflBdst, code:string|number) => void; + htdflBdstReg:(data: customHtdflBdst, code:string|number) => void; + getHtdflBdstData:(pageNation:number, code:string|number) =>void; + }; const htdflRes: customHtdflBdst[] = []; @@ -122,26 +126,43 @@ export const htdflFacStateExport: htdflFacState = { }, }; -const initFetch = async (txt: string | undefined) => { - const htdflRes = await getFetch( + +const initFetch = async (code:string|number) => { + const rswtRes = await getFetch( "wr", - `/drain/facilityList/1/20/0` + (txt ? `/${txt}` : "") - ); - const chHtdflRes = htdflRes.map((item: customHtdflBdst) => { - return { - ...item, - bdstChgYn: item.chgBuilding.length > 0 ? "Y" : "N", - }; - }); - return chHtdflRes; + `/facilityList/1/20/${code}`) + + return rswtRes; }; export const htdflFacActionsExport: (set: any) => htdflFacSActions = ( set: any ) => { return { - initHtdfl: async (txt: string | undefined) => { + getHtdflBdstData: async (pageNation: number, code: string | number) => { try { - const htdflRes = await initFetch(txt); + const rswtRes = await getFetch( + "wr", + `/drain/facilityList/${pageNation}/20/${code}` + ); + console.log(pageNation) + // 여기서 상태 업데이트 + return set((state: htdflFacState) => ({ + ...state, + htdfl: { + ...state.htdfl, + htdflRes: rswtRes, + isInit: false, + }, + })); + } catch (e) { + console.log(e); + } + }, + + + initHtdfl: async (code: string | number) => { + try { + const htdflRes = await initFetch(code); set((state: htdflFacState) => { return { ...state, @@ -156,7 +177,7 @@ export const htdflFacActionsExport: (set: any) => htdflFacSActions = ( console.log(error); } }, - htdflUpdate: async (data: customHtdflBdst) => { + htdflBdstUpdate: async (data: customHtdflBdst, code:string|number) => { try { const chData=await makeMdfr(data) const res = await putFectch("/drain/facility", data); @@ -164,7 +185,7 @@ export const htdflFacActionsExport: (set: any) => htdflFacSActions = ( alert(" 수정이 완료되었습니다."); } - const htdflRes = await initFetch(undefined); + const htdflRes = await initFetch(code); set((state: htdflFacState) => ({ ...state, htdfl: { @@ -180,7 +201,7 @@ export const htdflFacActionsExport: (set: any) => htdflFacSActions = ( ); } }, - htdflReg: async (data: customHtdflBdst) => { + htdflBdstReg: async (data: customHtdflBdst , code:string|number) => { try { const chData=await makeRstr(data) const res = await postFectch("/drain/facility", data); @@ -211,7 +232,7 @@ export const htdflFacActionsExport: (set: any) => htdflFacSActions = ( } } - const htdflRes = await initFetch(undefined); + const htdflRes = await initFetch(code); set((state: htdflFacState) => ({ ...state, htdfl: { diff --git a/apps/wr/app/store/ruseFcltMng/fcltReg/rswtReg/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltReg/rswtReg/index.tsx index ea7f38244..bd7473bbb 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltReg/rswtReg/index.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltReg/rswtReg/index.tsx @@ -17,6 +17,9 @@ export const rswtZod = z.object({ archChgArea: z.number().default(0), rgtr: z.string().nullish().default(null), mdfr: z.string().nullish().default(null), + bdstUsgText: z.string().default(''), + cityText: z.string().default(''), + sggText: z.string().default(''), reuseBuilding: z .array( @@ -56,6 +59,7 @@ export const rswtZod = z.object({ wtrUsqty: z.number().default(0), oblgTrgtWtrUsqty: z.number().nullish().default(0), orgwtKndCd: z.string().default(""), + filtrTrtmfctCpct: z.string().default(""), filtrTrtmfctProcs: z.string().default(""), filtrTrtmfctUsgCd: z.string().default(""), rswtrUsqty: z.number().default(0), @@ -128,7 +132,7 @@ export const rswtFacActionsExport: (set: any) => rswtFacSActions = ( rswtBdstSearch: async(txt:string,pageNation:number,code:string|number) =>{ try{ - const rswtRes = await getFetch('wr' , `/reuseFc/rainyInfoList/${pageNation}/20/${code}` +(txt? `/${txt}`:'')) + const rswtRes = await getFetch('wr' , `/reuseFc/waterreuseFc/${pageNation}/20/${code}` +(txt? `/${txt}`:'')) set((state: rswtFacState) => { return { ...state, diff --git a/apps/wr/app/store/ruseFcltMng/fcltSttn/rainSttn/excel.tsx b/apps/wr/app/store/ruseFcltMng/fcltSttn/rainSttn/excel.tsx index 264e3b6cc..5387f4292 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltSttn/rainSttn/excel.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltSttn/rainSttn/excel.tsx @@ -1,6 +1,6 @@ import type { customRainBdst } from "../../fcltReg/rainReg"; -export const excelSttnParsing = (data: customRainBdst[]): string[][] => { +export const excelRainSttnParsing = (data: customRainBdst[]): string[][] => { const excelExportData: string[][] = []; data.forEach((item) => { @@ -31,3 +31,4 @@ export const excelSttnParsing = (data: customRainBdst[]): string[][] => { }); return excelExportData; }; + diff --git a/apps/wr/components/ui/form/fcltReg/htdflReg/htdflRegForm.tsx b/apps/wr/components/ui/form/fcltReg/htdflReg/htdflRegForm.tsx index 62af8cd19..17027335c 100644 --- a/apps/wr/components/ui/form/fcltReg/htdflReg/htdflRegForm.tsx +++ b/apps/wr/components/ui/form/fcltReg/htdflReg/htdflRegForm.tsx @@ -30,7 +30,7 @@ export default function HtdflRegForm({ htdflForm: customHtdflBdst; isModal: boolean; }) { - const { code, htdflUpdate, htdflReg } = useWrStore((state) => state); + const { code, htdflBdstUpdate, htdflBdstReg } = useWrStore((state) => state); const defaultValues: z.infer<typeof hdtflZod> = hdtflZod.parse({}); @@ -41,15 +41,12 @@ export default function HtdflRegForm({ const onSubmit = (values: z.infer<typeof hdtflZod>) => { if (isModal) { - htdflReg(values); + htdflBdstReg(values,'41'); } else { - htdflUpdate(values); + htdflBdstUpdate(values ,'41'); } }; - const onSelectValue = (val: string | number) => { - console.log(val); - }; const cleanHtdflData = (raw: any): z.infer<typeof hdtflZod> => { return { @@ -159,7 +156,7 @@ export default function HtdflRegForm({ label={""} selectClass={selectClass} selectArray={code.yn} - onSelectValue={onSelectValue} + onSelectValue={field.onChange} value={field.value ?? code.yn[0]?.val} /> </FormUi> @@ -259,7 +256,7 @@ export default function HtdflRegForm({ label={""} selectClass={selectClass} selectArray={code.yn} - onSelectValue={onSelectValue} + onSelectValue={field.onChange} value={field.value ?? code.yn[0]?.val} /> </FormUi> @@ -296,7 +293,7 @@ export default function HtdflRegForm({ selectClass={selectClass} label={""} selectArray={code.yn} - onSelectValue={onSelectValue} + onSelectValue={field.onChange} value={field.value ?? code.yn[0]?.val} /> </FormUi> diff --git a/apps/wr/components/ui/modal/headChModal/headChModal.tsx b/apps/wr/components/ui/modal/headChModal/headChModal.tsx index 2f1236f27..1f97373ca 100644 --- a/apps/wr/components/ui/modal/headChModal/headChModal.tsx +++ b/apps/wr/components/ui/modal/headChModal/headChModal.tsx @@ -1,5 +1,5 @@ import { useWrStore } from "@/app/store"; -import { rainSttnHeadListType } from "@/app/store/ruseFcltMng/fcltSttn/rainSttn/headList"; +import { sttnHeadListType } from "@/app/store/ruseFcltMng/fcltSttn/rainSttn/headList"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from "@common/business_components/ui"; import { Button, Checkbox } from "@common/components/ui"; import { zodResolver } from "@hookform/resolvers/zod"; @@ -7,38 +7,32 @@ import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; -export default function HeadChModal({type }:{type: string }) { - const { rainSttn ,rainChSttnHead} = useWrStore((state) => state); +export default function HeadChModal({headList, type }:{headList : z.infer<typeof sttnHeadListType> ,type:string }) { + const { rainChSttnHead , rswtChSttnHead} = useWrStore((state) => state); - const { rainSttHeadList, rainSttNodeList } =rainSttn; - let items = rainSttHeadList.map(item => ({id:item.id, title:item.title, val:item.visible })); + let items = headList.map(item => ({id:item.id, title:item.title, val:item.visible })); - - // const FormSchema = - // z.object({ - // id: z.string().refine((value) => value.some((item) => item), { - // message: "최소한 하나를 선택해주시길 바랍니다.", - // }), - // visible: z.boolean() - // }) - - - const form = useForm<z.infer<typeof rainSttnHeadListType>>({ - resolver: zodResolver(rainSttnHeadListType), + const form = useForm<z.infer<typeof sttnHeadListType>>({ + resolver: zodResolver(sttnHeadListType), defaultValues: [], }) useEffect(() =>{ - form.reset(rainSttHeadList) + form.reset(headList) - },[rainSttHeadList]) + },[headList]) - const onSubmit = (headList : z.infer<typeof rainSttnHeadListType> ) =>{ - rainChSttnHead(headList) + const onSubmit = (valueList : z.infer<typeof sttnHeadListType> ) =>{ + if(type==='RNB'){ + + rainChSttnHead(valueList) + }else if(type=== 'RST'){ + rswtChSttnHead(valueList) + } } return ( diff --git a/apps/wr/public/sample_rswtSttn.xlsx b/apps/wr/public/sample_rswtSttn.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9f602475286e37f996002d81a9eef0bfd61d51ca GIT binary patch literal 9159 zcmaia1yEdD)9v6+ung`J+}+*XEx-VS1PxAbcL*9ZxCQs%7TkinySoO+Blmvq-S6_= zUvH}RIdjg;TD5C+S9e$UR+fW;#sa_s-~r(-g}Ual*?pS;06-8D06==V8#;ik9hn&a zT%+PT6}y>{gHNSf#1eiT*h<4^=Qqp8yNFrv`^qeFe!!HHf!#hvz|NY$5m<PB`c<=i zZ0nHgmYYoPK{>0z0OLN=`=B`RWfF8v;yQ9Xa+4xCED`?+KaN^KkY;|DfCwV)WB~My z`!iEwQf{|?*PMv3fRR*X@u5d(yMQU%C6-jKDSs*-jUusMlAGhAu7bymxs;$G4g@>+ zB6yhgM;EXrU;T*1B_WZ$G*gxrB3SvYHO(69gc;Ao>Y;ybBrKc%j`XZw8<tks%uv{~ z(1iZEW2R-GYjii=<rxZ84VQ%=gz~?%&@JG1t%3jm%Ao)Nv==Q*?M##%?Cc$xK=$^G zZZ_5#YMr)=%*d^8=7eyXxLo`}IFR!au{nDn38)`7W2y3sqBb(0wR4weW8yxmTY4-+ z#hiwHBBSxX=T+)~9Hq;(syEOm1u!TSUMbgv-0W;%H(R&)Y<if}bE~f*@n(CCNQyTz z$T3MJ2N|N5h3!YB!C*LvSw0xZeCNCX!$xfveDh8^3(w-)V>~J*k$c;K^lUdi+P^j? zRBs35x4KKLi;sicR~cE6@1ikWlH%$CK?@t~gp>HlGg!=|X=rG~3KiVhVkt^fNQlV? zv+l^OyH$#I!6_u|PK81BV;7z=U=5PCQ|{WTKFq6m2?)<#8DDe^jY0n|b84c3fe`uy zx0q_>XV35Yb<2b0X9@?Cn($m$Cjy^jJMM;3uQN*u<O&{^T8SC_*Hwu2=0$};$!(S` zI2x+Caq4Ks70gGV_}sTv<teGQH5Z7m-nRx%L8&&{=TdI)P^I&tP?&g@pGA^{Bi|j4 zbCh+3@rvnpu?&OVOT7cN;*<OxLDE!j#M7H2xbA*^eegF-e!pv$8)C{)qeWu#@Gj=O z$7wO-0Zx~B&w^OdhL6(1s4!;Y5$fOO{Rw5YC-7ok!WUOZ|8Mh}*g1gz*w-dj<i+99 zByOdbNG}9G#sSrJis>K@!eyng{N{9SYU@G?hd33QH(^V4DmUSm!ijPebwwkZ2!0FM znYBfX%O;Lvl*T6#<<QHhK&NVn9^9h|$oHKCqW11}I#JdWgZT7tD-HZ3L~~sN(@1sQ z?BIK&nS@!sK!>1ilvan|D=+YHMz&Y-tnn)_RY8tHUm|mL%sGkIN+GV0j+8Ly`L5x} zDrdEJ>%^@KRlt=j4FqfQ*wgOM!Yb;*tcGQHY@3>w9`Y7@9OHq0BMT|mo-V4H6la*H zLggq30+Xu4Vs8*VwSoSawtn}66IA#$28l3&Zq})CJC77U1mj7{XRdaiOfIj1HiGSX zGeR6_i<_YfuHqoW>gE%zPe<=p<@-W+EWObSpSX$TYa*}UC`K~V_WJ+}(LB$fCYXO~ z{bU#DtNfz1){E9}UbJ?zW^%Q2urju@v-+cSluD;+7c*Kb-=>hM!xz=sB4ir2XkG^u zGjZ+^GdZ?AnRf_SzgHAKpxb`sv|GJ7Zkydd(x!6&9OjKj76gz|W+9R1t*}1SdA7P| z)jU3YSioyu#Hk_Yt{}`!yd9yC(N_@}S?*xZilvDvYm~BR2(zNMU#A5amYA{=M8~Jf zDewh_J;emm$mw*{(A;oXtcGbTFKyP9$3^Ad*CrrpW<YeM?PSb$>~&Gw=93ev_<9D@ zQL8N7W0MNNOP->o0vYjKR{4+fMS;%oZ0nC(J|F~DFFf=hZA}c_TdubxJmvYo0`Qef zWU+T9nm;G26^&=l9(D6rb=xhhgP!{%rsYkjf`Oa6FXbvTFEZD4L^ouhd5OtSH_=k@ zJ}hsWz8Qk|`3ZAjKSDAh*!v|4D(<R$RX?DSiir<U(toG@X-};}j}Nv~--k~>tr+qF z{9F8#j>D6!7tz;W#K-$v{J+Ecf1BX15MLHI_TeSO_nro{1&n)roQPtP%rF?tnl1ML zY*K%;FvgcV%xtI_Fj625L3Lp9jC<NQmnpe!JpF-AUbjL+T}=SZyIC^Bf!KDNId)pf zh^<sY=#n}~SZzZROT?pUl+qoNU`l_J%1Zn*U;fynf@ff^KWjvUi~5WEGu7rC)F7Wy zRT<U~8x7w%LrB4m<HIJ7@8>&(Qhk_|TLXPiI^v22yqx`r&!Q9|^0AZ~Kgjxs(<Svr z!+MLsZryl!1fxD^t-~_np8KC|rQ09QZ(2qXO`LxmM3^jevrKaHN4aoG(^mXj8@9(Q zk!{$Qd`AKRVE(O*lLgoY%=Fil<&Se7>&V$Ha-+2|RsQz-3F%>F(ibylxlDGEJ8v@y zTeT<=Q!B4$O|6o(NAY~iM<C1kcHUvZ+0QtZz&I@3jwpS7`17Zy8&Zs|=;DMSw>1t! zPX4Y9VMezWJhx2qcx-`~ywqMKTGL_JmEe3L_g_1=tNm7=%Ef>zkOUi7>8LHrhg*+Z z6evc?1x(;B<77SAw<;(VADpX|uZXy%HnwWV_r8iJ^bv(wLPrWQeBn1THPilN=dfb} zQBkEhB1|$hRcS^EJ;7+37EHFBCzjn$_!jET7X8*!q<}>XeCmf}95<9lsD2s6$QWGx zJpp|JRLsW``~IwmMYSohvYjBZ5t(Km&OtO6GR*K=Q7zKVb2n~VO;TJ26i98%k`lUN zfqjlA!Z?CYzqAv%t)1|WTb1(~eroo#wVnRT@Yc`?SrM$K`)QE7*v7pKC-DjCSUt<; zw=wt8NdQ@EkPF?<0iE{66(orV<+HnbNcK*)6m>9gN{)unmCVEUh~ry70|2r*)Q;SZ z#-x>Lf&4+?8v+`Rs0c?)*b0TU4Ah*I7~aU+LQS9|9<3xH247!M3jD;NxNq|aweW=S zx%iuwc1%QkXS%I1AtI{y$#J?zn>qvZUq6|l%7Rx%y~mDDE5SZYR28Kb-F#ftpFhfM zPLtz$`%JO_T-Ry#V`U6BNmzGH&46klQAoTxz7tqI`=G>I2BqAOLut{lnLAaZg5=Y@ z+&fo!U>LdJT*`=*(OhcAZ%lLFe=-miX(Ymea%6zSsU;Mg9+dFqGdr{nM@}y<J%pfb zQBm%#&b)#l7R3T@NAq<<9K)n?8ArwVo)=CcKuZ<T@Y@26hn<ss3#VRR$*26Oh5YvH zt8&Fc(kM9y4uf~fVHY;_lOf%o6NkS8*=L-3j0?h2;v0ssc<1i;)(v@>?zh9?WD6XM z2ecGD2d%!?_wMGCtoSpzLq9K1m7xSGTQXF%p&5oZP2*NIvqILhzUAm0Nv3A_&DS); z{tc5QH`bo;#_ynVG<07QhVhAe8cl?biUOBOJ9P#mM59goE_p>w`k-#ziIP(VH=Dh^ zEdJb2cArf0!Ubo7y0}~3ouDbXeL`;zFF{}KJzR6#Hlfu@XC}KKj-(+sUC{U>=A3yO zZE+KdFk6kLt#t<~wMK1dpYyhYeUTmTxBiOtNQmwgQbGfg1>XVZ({^r-OX#zY_MoH_ zp&{E`&#%j8M@qKs%00wPx_L)RI{$UI#3SXC`;~_}1|1zC^D$eu{;(UOtt9=>;uZKC z(w<9YM6f%HpGZKr6_%zxIRz>ILW|0<5s=1DGn@=6C+|7r&>n9B8Z~H#(eG=;g#0Ki zWtjXrFLVf!%gqJ_HuNkX0VkP3fz$B#EFxDx5z(}k1E^5Xj8|x7<NGwSot3bSr`~!M zEA}!geI{+2vu34G++Bgn-M~d!O7+@e#zn@q%;7Mc=Q@-H4FY@KS{mb05H6TxxY!8k zkbwjSvDrRFX*{U!$_{S=W{AKV_=6WmirC|O7~?4Xfjm2KVU5+52u^cOCCd()K+CW2 zZf-iuOFF;?i=cZbrA~t>4f%qaC3H>!lZ@&Xs$!Mr*o`7<phHiT963e>vNJx_EHnJ= z(hlqb1#&-yk~E!gT~u(JNilAjIMfmlxUztaLRlOpdmUPk9mSbmJv#c1c>)HS|A#=T z>jH!i!I+@-6xrDP))u2|dC%mu)ip_rx4^ah0(B3f9-~gy^4>?u;SY<mrOf?xW*_hv zPX_c$r%{63Seqe{-=ATfK(MH#V1Jk6dhRTK@x}TU52h$5m-KLoJe_f7gf3W!Xx$2K z?5!YH?#(>}$rE<SvPbVU=1YQsg5x%~`T<j-JLOJYq|JCh+Xc1kup+*j>b|mQMO+|% zGWFgqi;@UQXCYp4uv<Wd!d=N+#<5z*K66aAkq+pa?+~<Cx0d+FqC8&p$oFDYKkoQD zYEm@bZzVedafR?B^tLB|;IWvy$`8xm9H+wel9L`G$g77|P68uC`(kyy$2gZg!McL3 z5lO1%vGqsw1B+}%8pGOQwxYjeys{KvsZWGBL>C!JclWf_>L+c)78j2-LS4UUwo6m< zdEi*{)I_T3bu=t^nInNFbFX{Lo7@-X@svv-xEn06Fu(6p>=0u)l|zEsqf=2qRCXi{ zn0IrQbE52BGwz^8Mq`Xx!gMjQlw0EtS0r%(6cf*W@?Ptb$NT<5c&UgkuQ>rzn9jXl zYEPS-ReVpE>L}hzLMdvpCsihULES45<1v`Q=O4WL#ToD3uRJ+1?yi!kN}h$;GYt1R z3G);Ar#=9*w(ND&HmXqKF@GKtNg&ugzbe;o9_vy`5C8!6_W%IO-&xVo$=w?4_$MDu z>%ZhfNwhZXJs%SF+6M6)q9lzWMC)njPY8$<Fo;+Jdm@XXGAf_<ItGemHX&v3vtTx; zXwu0TRBI6&>`l1(N$<tbuZek^J&#JoKhj8$X#tHQ5?pr{Q|!!cC^eY~Q-d88PT%lq zy0YaO41=*+7poUCPFBozhDsKKu7~p%LWtGjZk)y1t1AxcAsLziMuyvLZUslo;L5y~ zt&tgZ1zM3Zk956iK;18~op0~@TGB%pFGZ3wbEphFB3YPLtkDctV73624<>Xv9+5}2 z1-E+C9h6UliMI#Lw-n2Gzh~=P;Q-=thW!(Qi<=t+Et6ZLVo)3CGK=w7etl|8UQ}+0 zD0@&G{cY5om&D16SX=m00Ku%#>Uw`U39Rka6Kt@b6|pkd1Xx;ytF^?_?%?v(#b72) zl9>{DYTYrD49FySl*gm$s8*!TK-NKwXHF&1k;MSfNC#4O`l6nz2q#h)xz#dQz?8L6 zZOC=`BBqM_)|OqEgZxIM)ct{Ejgm-J%6M0?ecY3Wrg$!Xq``QSsqB^N2g=E!qWpyP zR{2xM8!D7}+OFSeQ;g)la9pGge+qk`rVrdBu>+8=MuVWcw?zFSgVq(x7Odv#S580J zXS<zN7@T(c)>%0_v!+V^77mWAjm_FOX#e<r<V$FDD=#6mM^AWUCI1cky^_6Ry4Yq1 zEAO$4m-vTP#a7mWH>4?rA!^sthl#TO4;OeXagz-iWEERi)3YwM4~h;Cz6{%@*T>dc zachNNaKjOj<BF^KoMgSL^o!MJmQ7oisMFQoLry0;sbgcDIAehJadFi1xApRPEmz5= zWq!>NK2l=vXVEhJ^#m+dTxi(da$qfz9cqwvo@kT!7Jqa6$)OEK!}9*GAOE~mFit+5 z)>BSQvWq>)^NLU(JJsU_1?}5S9yEaL23Oyy4l(OEolbuXZbM2F)wxw_uW3*!Z)vZe z4nTTnww$jAcfI{27I@*0)zn^>QgyrkoX`xnrQp+Wxh3HUIRk7!2*7H9=^|{9G2J!R zL$I{+LMqs)?^@E4uEkwdi#I<j`_$T2vyJCjMaXvTvfF{YpF&&|T0JfxQ9y>DN&q_h zhLK~wM0E}ykobcF*%rfcmO9ULw`-L;be?C4!eIA|S7~?@L|Mf<TaTIwt3$Wx8PXHz zq_kvF9k9Vk`W}lb{Ag>~52svda>kLzuF%!ME8EoA(YrdA;Y8^7?^tEgYlU*tUWM)C z@c1^A67261(qrNZz-69FrtT4Z{BmF!L-{ps-gk!2H2EDPX{@$PKpQ*ZbAtkXcw2y< zLw?}rjT=@%HBqz)5Mu(_GIROocum7&*nkydm=9Cy<r`mP9$FNl<!H93<9-8gTv{5+ z32t*VZE!ML%ZpuY9NLCXYWwGlf%*q0JcUQ=C&^1>1kq?nns}{WKY9&eE3W_4Tdc)C zO0`zZrV}16Z`;$WU#Z^DW^?GWGApg*ucTE5N!HRTM<^d^!O+nkl_RQSRsQH$hu|~U ze=o?K_Q^1}j}aTk5S~@uOACcn<WvXuXH6~qOlDFmJEIW8>NkqnavXFc7^7*DcnWkg zuu+dXS;y}hVO>FVBTRBEGBj~uXx?0~4mvz3pLjp?B#C5<R??}PHq31qVw;%^A~zq( z#f3<0XZY@iGe#&FdWAO$;TJq1v>Ix~MM+R-W_0jhuxvQW^r4muvL`SU-4ALv;Ev*9 z$-lV>d+#jcvJPH!Ye>MLTD+r^Rp0atuFeq$qlQw`$R;4l=;}ixe5Rt5K=>6VQm57! z=C3aj4RR2JDK;`TbI{P$P0*iCLZs}I4;y-8M%D6#eUyc5yG#ftzvUW^4YMtsu4ITO z`9hOq>$0T<20k~T;n|+?O9S8|^LCl=-0lUCBvN(dp}SFk1@cE{LIWgeCiYtEqe-;? z3%t37#12B0)Z!65;Qqd?RHB@IrPj6KZ2UyP%X{Fc`F3!<ygf>&QAr6>`1@~S>11sc zwZ^9#uaeb9h>5^LsGaeqV?qR90FL3T9uZ<S{YKiD1|1<XHyPW<2eM!<?4_FIKG7s3 zYd;cSFvgvi=FLb?AOfYW%jKrL@Ew+VHI!h4Ja;?<OFW?_+7x8>_7nFH>jq(IX2^AN zH@_2o68U7POJ<n!UhB7#&oGc_m6`M%M!chX@``<3PM&X#x;*(|lAW@U#Ppox6NU2d zkOSXdn6{0`3*J^ah`76cI(qzg;OX;@dh9F`J>UH&%bFaQ>1U*PZk#tTQL%USJP-qy zrqSVBSmyDV;w=1HLGd+$Y3aU;Fx8NqXIPgt0|@<6iXdYitCw$cDqF|;81s$XBZj6= zA=gL+HRI2C@tAiJqcgDt7ey)5?J)zOXR-(nX;dB(fdGOXrfRJ2t&a2Elr3f-kvCNY z7YsePXUsn5E{tJEEu15U{BJ-8#8Kw*sF&Dd-Tt8=CJxE%ZbU!{euDV!$DTe96|B=g zukPHK!Z*DB{L5}Pu7C8)0O@<EZCi1?SOw8)YGRnr$hoZq((sRIyZ1`OOmBM@g&{BL z$2_HdSy-4eFVaJ%u+<<hsUl5cNlEv65;`9H_2RtO$tF;lR@?YISUt}dTq(!oxUs2( z?Ohfdoe#LE<m};vtf3?th*m!BEj{+xDY!;yqYg#zGkd!D-0@qCU;@n4Ag2p|qZ%%| zDEi-cl7!I<@$(Tsof-P3+aa4qYMv~4^Ll!-^ET}+dGR*k&k^Ndr&UnMZj6q*4(^Rt zU2=aG24Yu11!A1E;66EQxSG&Qh4YFmdT0FVwHsAaN&scR6`mS=MfDL>$--}gPb@Sv zNC0NQ?T%LLcGt`f?%icy-g!Emj+~vQ<)$%t`tg&BJa`u_&kSs4OSJwvZgYH`!4`83 zLFbUTviBCk6TBa?Q&6l2RfK-u=jXu{^a0lH#6!YkevYU|l`Pt_c&A#9_#~PJ7nb;y z(pVq_J|<V7|J#-u#SCL4@;3qLV%jm9tPtT}nL@lVJ{JsMcALLqyF5)J+~8%7ifGr` z_QT~$-9jzvw@dK5Eaqr$;F7aGU|n1i`c5%NJ(h}gL{blZjWPH|{O<;XtqpD^#!KTR z0tNuU`cElk0dfGFsyR7W+M54WQAH)FSWPNp^{v9Ri}g3lH25LQ)WCHrWf5mNeMF&` zu~9u|aV)MaH3FA}=><&h_fm+?6yyfo1vx0S2fPcbUB8ihNOttTP5&*h>qAc1G8x_2 zAUmXv(mHqw|MsieRny0!11XK?=^<>Tn|rAHbMgUp22_>h(hHQK4}zEyH7m-ssWdnW z5`Du~x%t!dkJf}?W;OX!s3XBS+6z_R^@{o5)}?;C)L*tZ)J$Am+-<BcZ?mKu(}K`p z)zGQl+TJCK3>lyY+%{0?R#Oz5^EZ%F+@kX%%b<~q6`-RWA)2li=m_}_@p0q(T?Qze zAgqmbhJ7(7O}XXa420>I3bFMcHwEU1@>XF;c{}eB==YsvD@kd+Q)Y1S7sB516c=O0 z7nvFv&tFs!#ec++__@?>?1~<#v`3JF%!1e^<sW)w!z}>8Me>GoB>z&^?W~7%*30Ef zItdaSrCoa46ZHES=C{I00ebjSD64#1g?)k<=mBwfwx8uq9K7FP#w<bKdvgt%D#!Yc z<5aZ5gvi}3Ecy>My_>`}00$5)x^dhA3-G~ML%R`b-|@EC9#4r736?{hfc6V|`0&e~ zn>7)MS)|>I@(J=ya&~QrfF%XiLP>46jz$FgMyIN}l4`n1%K~~l-7zu`d8a0e=PT@U zL28}xX@G*h@woq~_F|8ew|lH!#SfzUm@o|Lja7|jq<{Mma5A~v>BV;<Ul#e_KJ=$` z=V$>2J2^7_-OKyy;jezxU!6RSNI6tUQZ$%bsujPh70ccr7TDwrxa2(u_<CUi!R)Z} zyXq<M_B36c=LFTt6n9c7=qm;MU^&0>4c<w^;W~1}{OOcz+Hv<f8ePQ4!BWyI1E$a; zNXj9#;)K2ndWLzyO83&4*3x(UvhH0si-6oSrVnlZ-n1;DUT7sW0KoIoR>S$fHvP|b z%d}TrbGWg*R~>JB*3R0<sx(JbcJFF*>*^LphfnZ(iqavvgs0}84tHT8VdBIxMsKpa zT-%qH(mc5k_Prn08y8XnW5u4n+Rhv_NqVN85d8i*Y529!r|w$mN$B^UfyEsIFGd%; z#hR4BQ@^$^3VC(RkD44jl+ZUx0w@9zomOtlIV3MJz;>$<_S>u-%9w+vz`1X?mFLf= zm8yZ{g?BM`^dB)WW{uHoot*roPhDM6=iDB3rEdhhj5gNuvaKZB@o%5zNxx9vma-f= z%jp}lRR=^mM-|@4?sF-oL#e}Ms>rViGNkdCvyzoBPQKfTDwkN@wB0b@>+a_r5Go{8 z+&tF~S%^L=iyz{=VkIA4@6XybD<k^dlf5t%#Cc|TNst^`Q0_hxb9cLOG{;hqhBC@U zYWfR{<-iLa_&)dD4zHk29Gf3A2$i&Qc(&{eroFfV=;SrI?<C*hJ)os`=fApoGmYN1 z#&tbi#IZm;I3Ae339<R6xZ#cYKnVAF?{;jYLt$|0NDOj&n5sF+AbV}hJ48fz(O*IZ zlh*kwYwNcra?^e*!6RFnH*~6Oak8N$AFNqQR#EmP0(u}lCH;E75MgrZDd%!Z!4bg1 zZ-k_740SfzxkRyH<uXu<iC6}(KuOWsmqNaywf_crs=g)<Gpe!H3gElv#zufY6iFhY zEohL(Z9LLMJQDE}psjTF_tUN+!tWu<RFy36i-KIFtu%+Z$>|V$hokNYg!zEoeRm<a zefTS(eYNoMQV>kyr2Y0(7``fw+(~BuowaNWep=HZFqDo*bTW~E^jtPt*^^QVOPErs zs5Op!%5VUETKQ$Eye!oL^y@!M?PaOIERC0?InbE%46B8;wib>^ps(T|K=;AEsHk&d zkfS9BIz%gB?JOLF04Vo4$XJKVNN9+YgB!nylLNIcq}}?w1bem(G}zD3nTzG2$7&Z* z*2|i!VJdGbnOnOm50)+5+fp=3&c8E9l(k&^N=Kcqd;*ruW#2?fF;1c$3hWx|nz!e& z4W}tnPdAIb%-TpWTT|(w8R_I*$KqU@I1|WESh})PrT-#fDcwLrIeVnz*NRo;Z%j&` zXw0)Tc`2ri*O@&`9koggV!!Omtb*JmcKztQRh>**$p^!!X5<LtQqciKv`#THBi&0x z^i=kXp|#KOwf{M`6)M~1qpB?XZH1aTpJtwxI-kc~Q&~37TSa*VE5qX5y|iNVB@x1# z^INC9`Kv9lXeyy|Gy9vjV=+)?gnF#>^24{_`ASZf)j88{0H{rWFc`f{-?17L$&CHg zI+=vN94M=zfWCu~ptnRi>`aYs2Jgr+7|he9A6van1Y(q%uM|$UQsbmY-+@d-p$lx3 z26sbs=@(V6qk|YV=PM<XD<rEy0nCO{9Y&@BFj@qiu@8YfoJ(Ox#bb9tNW*x)xJU$+ z3&{^6hKjy}jR^Y(5#K};TQbfEXdcu7J&}S2-pXEdSpWprB*kV8XaYQ9ua4nom7v?u z59_GrZW5{+xZorBRxw-<Yda97zdJt%pslg`2cs@=^k~To2xO5WF@#WtnKl?bW&S(L zG2{gW`@9UcvR~5spZS5Fn4PT?*w)EV-Q6DS`2J77q)dItHh>weMe9I_q#T`lKl>Xk zNr+&yO<n=<+6JZe9p$3?lNUC;3Lb|abt547dbpBp#k47wOxw>{zl1&g$0jo%(W-Zv z45fYdbX<*l<m5E&e#RH6QoE6zzLje%@Ouli%==Ol>PJ-zy5he4_h@35;f%igk$o`~ zvx5N_u@x*`^zK3aj6rW!IPaP$>q+!+T55whwD43-pvQ`(K&JU~=yJ6tp&!lFHf3#> z;K3vi^DK{Y8eh`Q@Bke}h306_<KH6ucRQTg66Qj*KfoGKbr5`b633@EM;k7>CRR6o z(=Uk@qY!+<8#WekT4>wR#ONHTGa*2z!q@(Gt(?la7ZO|!eWv<@Vb2J~%BF<4tVFM* zX!=K-1BX09Dp$<{cb5ieKUFu`?_m6g24zpsS@HwXly`i#pcb;WsWOZ97|4g2H&;o| zV56dn$?hXyY3W|<2;|lII16D>y(#V3{EYTEvPtBVoa2S&V6*N}(p05!DtP$DlFIhx zC6z+Flwbez35OS>0bUIFpU;1tcX$naeH`Eq;%^}G%kA~yfY<2P)8>EBhcDavKj{BG zdwvanJwW{juJw{*UyV~=gI^B-{{c_Exa|x0e;5b8=6O9V`-kW3WrX&^^Lljln&5R` z@gD+M)V~P+=`y~CzOJMHfvRBt4Siizzh-z{Mg7B&i2E1A|F5QcP58RP`G-*UWz6~? roBXFp`={P{&GI^e{KLXb{Qrz6%5pF-YX3Q&g9I3V@trl2KTrP)(Ctw} literal 0 HcmV?d00001