From cc21aaede151a1b319f1da2a389a4e458db8f663 Mon Sep 17 00:00:00 2001 From: ljpark Date: Wed, 10 Jun 2026 11:16:10 +0900 Subject: [PATCH] =?UTF-8?q?wr:=20=ED=95=98=EC=88=98=EC=9E=AC=EC=9D=B4?= =?UTF-8?q?=EC=9A=A9=EC=8B=9C=EC=84=A4=ED=98=84=ED=99=A9=20=EC=86=8D?= =?UTF-8?q?=EB=8F=84=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruseFcltMng/fcltReg/pbnstReg/utilsZod.tsx | 8 +- .../ruseFcltMng/fcltSttn/pbnstSttn/page.tsx | 46 ++--- .../ruseFcltMng/fcltReg/pbnstReg/type.tsx | 17 ++ .../ruseFcltMng/fcltSttn/pbnstSttn/index.tsx | 167 +++++++++++++++++- .../ruseFcltMng/fcltSttn/pbnstSttn/type.tsx | 3 +- 5 files changed, 215 insertions(+), 26 deletions(-) diff --git a/apps/wr/app/(with-layout)/ruseFcltMng/fcltReg/pbnstReg/utilsZod.tsx b/apps/wr/app/(with-layout)/ruseFcltMng/fcltReg/pbnstReg/utilsZod.tsx index f61697e7e..e36a8433f 100644 --- a/apps/wr/app/(with-layout)/ruseFcltMng/fcltReg/pbnstReg/utilsZod.tsx +++ b/apps/wr/app/(with-layout)/ruseFcltMng/fcltReg/pbnstReg/utilsZod.tsx @@ -6,6 +6,12 @@ export function createDefaultPbnstItem(row: pubHasuType, index: number) { return JSON.parse(JSON.stringify({ pbnstRuseFcltId: pk, swtrmtFcltId: "", + swageTrtmfctId: row.bscFctCd || "", + swageBscFctNm: row.bscFctNm || "", + swageRgnCd: row.rgnCd || "", + swageAdstDstrCd: row.adstDstrCd || "", + swageRvbsnCd: row.rvbsnCd || "", + swageFctCpc: Number(row.fctCpc) || 0, ruseUtztnFcltNm: "", fcltCpct: 0, ruseCpct: 0, @@ -44,4 +50,4 @@ export function createDefaultPbnstItem(row: pubHasuType, index: number) { cycl, // 필요한 값 있으면 여기에 추가 } as fcBizType; - } \ No newline at end of file + } diff --git a/apps/wr/app/(with-layout)/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx b/apps/wr/app/(with-layout)/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx index 0e49c4c6f..70914ab7b 100644 --- a/apps/wr/app/(with-layout)/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx +++ b/apps/wr/app/(with-layout)/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx @@ -39,15 +39,13 @@ export default function PbnstSttn() { auth, code, pbnstSttn, - pbnstSttnSearch, - pbnSttnInit, + pbnstSttnList, getPbnStnDetail, - getFlcts, // 하수재이용시설(tb_wr_pbnst_ruse_fclt) 조회 resetPbnstDetail, getLaeSeCdCheck, } = useWrStore((state) => state); - const { pbnstSttnRes, fclts, pbnstSttnResCount } = pbnstSttn; + const { pbnstSttnRes, pbnstSttnResCount } = pbnstSttn; const { laeSeCd } = auth; // 지자체구분코드 const [isReset, setIsReset] = useState(false); @@ -110,16 +108,16 @@ export default function PbnstSttn() { const excelClick = useCallback(() => { isDownloadTriggered.current = true; const fixedSearchValue = getFixedSearchValue(ref.current); - pbnstSttnSearch( + pbnstSttnList( true, String(1), "100000", fixedSearchValue, pbnRuseNm, searchYear, - fclts + [] ); - }, [pbnstSttnSearch, fclts, pbnRuseNm, searchYear, getFixedSearchValue]); + }, [pbnstSttnList, pbnRuseNm, searchYear, getFixedSearchValue]); const cellCLick = useCallback( (index: number | undefined) => { @@ -134,28 +132,30 @@ export default function PbnstSttn() { useEffect(() => { getLaeSeCdCheck(); useInitRef.current = true; - if (!pbnstSttn.isFcltsLoaded) { - getFlcts(); // 하수재이용시설 조회 - } }, []); useEffect(() => { if ( useInitRef.current === true && laeSeCd !== undefined && - pbnstSttn.isFcltsLoaded && - !pbnstSttn.isTableLoaded && - fclts.length > 0 + !pbnstSttn.isTableLoaded ) { - pbnSttnInit("1", String(DEFAULT_LIST_SIZE), getFixedSearchValue(ref.current), searchYear, fclts); + pbnstSttnList( + false, + "1", + String(DEFAULT_LIST_SIZE), + getFixedSearchValue(ref.current), + pbnRuseNm, + searchYear, + [] + ); } }, [ - fclts, laeSeCd, - pbnstSttn.isFcltsLoaded, pbnstSttn.isTableLoaded, + pbnRuseNm, searchYear, - pbnSttnInit, + pbnstSttnList, getFixedSearchValue, ]); @@ -262,16 +262,16 @@ export default function PbnstSttn() { } queryClick={() => { const fixedSearchValue = getFixedSearchValue(ref.current); - pbnstSttnSearch( + pbnstSttnList( false, "1", String(DEFAULT_LIST_SIZE), fixedSearchValue, pbnRuseNm, searchYear, - fclts + [] ); - setIsReset(true); + // setIsReset(true); }} excelClick={excelClick} initClick={function (): void { @@ -301,16 +301,16 @@ export default function PbnstSttn() { }} onPageChange={(page: number) => { const fixedSearchValue = getFixedSearchValue(ref.current); - pbnstSttnSearch( + pbnstSttnList( false, String(page), String(DEFAULT_LIST_SIZE), fixedSearchValue, pbnRuseNm, searchYear, - fclts + [] ); - setIsReset(false); + // setIsReset(false); }} resetPageNo={isReset} widthFixed={true} diff --git a/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/type.tsx b/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/type.tsx index eafbc4477..c39d3d72b 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/type.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/type.tsx @@ -62,10 +62,18 @@ export type PbnstDemandComType = { export const pubHasuZod = z.object({ choose: z.boolean().default(false), bscFctCd: z.string(), + rvbsnCd: z.string().default(""), // 권역코드 + rvbsn: z.string().default(""), + lgbsn: z.string().default(""), + mdmbsn: z.string().default(""), + rgnNm: z.string().default(""), + rgnCd: z.string().default(""), // 지역코드 + adstDstrCd: z.string().default(""), // 행정구역코드 sido: z.string().default(""), // 시도 gugun: z.string().default(""), // 구군 bscFctNm: z.string().default(""), // 시설명 efflWqltStndrdNm: z.string().default(""), // 지역구분 + tel: z.string().default(""), fctCpc: z.number().default(0), // 시설용량 addr: z.string().nullish(), // 위치 }); @@ -258,6 +266,15 @@ const PrfSchema = z.object({ export const pbnstRegZod = z.object({ pbnstRuseFcltId: z.string().default(""), swtrmtFcltId: z.string().default(""), + swageTrtmfctId: z.string().default(""), + swageBscFctNm: z.string().default(""), + swageRgnCd: z.string().default(""), + swageAdstDstrCd: z.string().default(""), + swageRvbsnCd: z.string().default(""), + swageFctCpc: z.preprocess( + (v) => (v !== null && v !== undefined ? Number(v) : v), + z.number().default(0) + ), ruseUtztnFcltNm: //z.string().default(''), z.preprocess( (v) => (v !== null && v !== undefined ? String(v).trim() : ""), // null/undefined → "", 공백 제거 diff --git a/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx index b1cf957e6..57cfd0a1a 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx @@ -3,7 +3,7 @@ import type { TableUpperProps, } from "@/app/store/common/type/header"; import type { FcPrfType } from "@/app/store/prfmncReg/pbnstPrfmncReg/type"; -import { fetchType, getFetch, postFectch } from "@/components/lib/api"; +import { fetchType, getFetch, getFetchWithCount, postFectch } from "@/components/lib/api"; import type { ReturnType } from "@common/business_components/ui"; import moment from "moment"; import { type z } from "zod"; @@ -54,6 +54,15 @@ export type pbnstSttnState = { type pbnstSttnActions = { pbnstChSttnHead: (headList: z.infer) => void; + pbnstSttnList: ( + isExcel: boolean, + page: string, + total: string, + reurnValue: ReturnType, + searchNm: string | undefined, + year: string, + fclts: string[] + ) => void; pbnstSttnSearch: ( isExcel: boolean, page: string, @@ -246,6 +255,119 @@ export const hasuListFetch = async ( return { data: data, count: getRuseList.count }; }; +export const pbnstListFetch = async ( + page: string, + total: string, + reurnValue: ReturnType, + searchNm: string | undefined, + year: string +) => { + let nameCd = "0"; + let partStr = "A"; + + switch (reurnValue.partValue) { + case "R": + if (reurnValue.regionValue !== "0") { + if (reurnValue.unitWaterShedValue === "0") nameCd = reurnValue.regionValue; + else if (reurnValue.middleRegionValue === "0") nameCd = reurnValue.unitWaterShedValue; + else nameCd = reurnValue.middleRegionValue; + } + partStr = reurnValue.partValue; + break; + default: + if (reurnValue.sidoValue && reurnValue.sidoValue !== "0") nameCd = reurnValue.sidoValue; + if (reurnValue.sigunValue && reurnValue.sigunValue !== "0") nameCd = reurnValue.sigunValue; + partStr = reurnValue.envPartValue !== "0" ? reurnValue.envPartValue : "A"; + break; + } + + let url = `/reuseFc/pbnstList/${year}/${page}/${total}/${partStr}/${nameCd}/0/1/SW`; + if (searchNm && searchNm.length > 0) { + url += `?swtrmtFcltNm=${searchNm}`; + } + + const response = await getFetchWithCount(fetchType.WR, url); + const wrList: WaterReuseFacility[] = Array.isArray(response.data) + ? response.data + : []; + + const swtrmtFcltIds = [ + ...new Set( + wrList + .map((item: WaterReuseFacility) => { + if (item.swtrmtFcltId && item.swtrmtFcltId.length > 0) { + return item.swtrmtFcltId; + } + + if (item.pbnstRuseFcltId && item.pbnstRuseFcltId.length >= 11) { + return item.pbnstRuseFcltId.substring(0, 11); + } + + return ""; + }) + .filter(Boolean) + ), + ]; + + let pbnListData: pubHasuType[] = []; + + if (swtrmtFcltIds.length > 0) { + let foUrl = `/prcsFclt/ruseInfo/1/${swtrmtFcltIds.length + 1}`; + if (searchNm && searchNm.length > 0) { + foUrl += `/${searchNm}`; + } + + const pbnList = await postFectch( + foUrl, + swtrmtFcltIds, + fetchType.COMMON + ); + + pbnListData = Array.isArray(pbnList?.data) ? pbnList.data : []; + } + + const data: WaterReuseFacility[] = wrList.map((item: WaterReuseFacility) => { + const swtrmtFcltId = + item.swtrmtFcltId && item.swtrmtFcltId.length > 0 + ? item.swtrmtFcltId + : item.pbnstRuseFcltId?.substring(0, 11) ?? ""; + + const findData = pbnListData.find( + (fclt: pubHasuType) => fclt.bscFctCd === swtrmtFcltId + ); + + return { + ...item, + swtrmtFcltId, + rvbsn: findData?.rvbsn || item.rvbsn || "-", + lgbsn: findData?.lgbsn || item.lgbsn || "-", + mdmbsn: findData?.mdmbsn || item.mdmbsn || "-", + rgnNm: findData?.rgnNm || item.rgnNm || "-", + sido: findData?.sido || item.sido || "-", + gugun: findData?.gugun || item.gugun || "-", + bscFctNm: findData?.bscFctNm || item.bscFctNm || "-", + efflWqltStndrdNm: + findData?.efflWqltStndrdNm || item.efflWqltStndrdNm || "-", + tel: findData?.tel || item.tel || "-", + fctCpc: Number(findData?.fctCpc ?? item.fctCpc) || 0, + ruseUtztnFcltNm: item.ruseUtztnFcltNm || "-", + fcltCpct: Number(item.fcltCpct) || 0, + splyExtraCpct: Number(item.splyExtraCpct) || 0, + ruseCpct: Number(item.ruseCpct) || 0, + usageTotal: Number(item.usageTotal) || 0, + inUsage: Number(item.inUsage) || 0, + outUsage: Number(item.outUsage) || 0, + operMthd: item.operMthd || "-", + rprtvBzenty: item.rprtvBzenty || "-", + bgngDt: item.bgngDt || "", + endDt: item.endDt || "", + prfList: item.prfList ?? [], + }; + }); + + return { data, count: response.count }; +}; + export const pbnstSttnActionsExport: (set: any) => pbnstSttnActions = ( set: any ) => { @@ -261,6 +383,49 @@ export const pbnstSttnActionsExport: (set: any) => pbnstSttnActions = ( }, })); }, + pbnstSttnList: async ( + isExcel: boolean, + page: string, + total: string, + reurnValue: ReturnType, + searchNm: string | undefined, + year: string, + _fclts: string[] + ) => { + try { + const pbnstSttnRes = await pbnstListFetch( + page, + total, + reurnValue, + searchNm, + year + ); + + if (isExcel) { + const pbnstExcel = excelPbnstSttnParsing(pbnstSttnRes.data); + set((state: pbnstSttnState) => ({ + ...state, + pbnstSttn: { + ...state.pbnstSttn, + excelList: pbnstExcel, + }, + })); + } else { + set((state: pbnstSttnState) => ({ + ...state, + pbnstSttn: { + ...state.pbnstSttn, + pbnstSttnRes: pbnstSttnRes.data, + pbnstSttnResCount: pbnstSttnRes.count, + pbnstDetail: {} as customPbnst, + isTableLoaded: true, + }, + })); + } + } catch (error) { + console.log("error", error); + } + }, //테이블 헤드를 조정한다. pbnstChSttnHead: async ( headList: z.infer diff --git a/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/type.tsx b/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/type.tsx index 7d0f8a068..ee202d4f6 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/type.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/type.tsx @@ -1,10 +1,11 @@ import type { PrfType } from "@/app/store/prfmncReg/pbnstPrfmncReg/type"; export type WaterReuseFacility = { + swtrmtFcltId?: string; bscFctNm: string; // 기본시설명 (예: "난지") efflWqltStndrdNm: string; // 방류수 수질 기준명 (예: "500톤 이상(Ⅲ지역)") fcltCpct: number; // 시설 용량 (숫자형, 예: 1) - fctCpc: string; // 시설 처리 능력 (예: "2360000") + fctCpc: number; // 시설 처리 능력 (예: 2360000) gugun: string; // 구군 정보 (예: " ") inUsage: number; // 유입량 (예: 1387) lgbsn: string; // 대수계 (예: "한강본류")