From 662fb390bcd12a5cf94e58d3cc62f12ef5794445 Mon Sep 17 00:00:00 2001 From: jyha00 Date: Sat, 26 Jul 2025 15:55:37 +0900 Subject: [PATCH 01/10] =?UTF-8?q?=EC=9E=AC=EC=9D=B4=EC=9A=A9=EC=8B=A4?= =?UTF-8?q?=EC=A0=81=20=ED=98=84=ED=99=A9=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruseFcltMng/fcltSttn/pbnstSttn/page.tsx | 1 + .../prfmncSttn/pbnstPrfmncSttn/page.tsx | 59 ++- .../prfmncSttn/pbnstPrfmncSttn/index.tsx | 340 +++++++++++------- .../sttn/sttnDetailModal/coDatailModal.tsx | 4 +- 4 files changed, 236 insertions(+), 168 deletions(-) diff --git a/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx b/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx index 2daef0074..371ed6cd0 100644 --- a/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx @@ -117,6 +117,7 @@ export default function PbnstSttn() { selectUnitWaterShedData={code.lgbsnCd} selectMiddleRegionData={code.mdmbsnCd} selectEnvPartData={code.lclgvrnmntCd} + buttonOrder={["query", "init", "excel"]} rightClassName="ml-auto mr-6 flex items-center space-x-1" leftClassName="flex gap-5 w-9/12 m-4" leftSelectClassName="w-1/4" diff --git a/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx b/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx index 42c252353..ae923df58 100644 --- a/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx @@ -22,12 +22,13 @@ export default function PbnstPrfmncSttn() { pbnstPrfmncSttn, // pbnstPrfmncInit, pbnstPrfmncSearch, + getFlcts, prfmnc, pbnstSttn, pbnNmSearch } = useWrStore((state) => state); const { monthHeadList } = prfmnc - const { pbnstPrfHeadList, prfmncRes, rawData, selectYearList } = pbnstPrfmncSttn; + const { pbnstPrfHeadList, prfmncResCount, prfmncRes, rawData, selectYearList, fclts } = pbnstPrfmncSttn; // const [isChHead, setIsChHead] = useState(false); const [fromDate, setFromDate] = useState(String(new Date().getFullYear())); const [toDate, setToDate] = useState(String(new Date().getFullYear())); @@ -39,6 +40,8 @@ export default function PbnstPrfmncSttn() { const { t } = useTranslation('base'); const searchYear = String(new Date().getFullYear()); const [excelData, setExcelData] = useState([]); + const [pageNation, setPageNation] = useState(1); + const [resetPage, isResetPage] = useState(false); const excelClick = useCallback(() => { if (!excelData || excelData.length === 0) { toast.error(t('excelDownErrMsg')); @@ -489,17 +492,25 @@ export default function PbnstPrfmncSttn() { sigunText: "" } tableHeadMaker(Number(searchYear), Number(searchYear)); - pbnstPrfmncSearch(returnType, "", searchYear, searchYear) + getFlcts(); + pbnstPrfmncSearch(1, returnType, "", searchYear, searchYear, fclts) }, []); useEffect(() => { - setbdstTable(prfmncRes.map((e, idx) => { + pbnstPrfmncSearch(pageNation, ref.current, pbnRuseNm, fromDate, toDate, pbnstPrfmncSttn.fclts); + isResetPage(false) + }, [fclts, pageNation]); + + useEffect(() => { + const tableData = prfmncRes.map((e, idx) => { return ({ ...e, number: String(idx + 1) }) - })) + }) + setbdstTable(tableData) + if (prfmncRes?.[0]?.pbnstRuseFcltId) setChartId(prfmncRes[0].pbnstRuseFcltId) }, [prfmncRes]); @@ -533,6 +544,7 @@ export default function PbnstPrfmncSttn() { rightClassName="ml-auto mr-6 flex items-center space-x-1" leftClassName="flex gap-5 w-9/12 m-4" leftSelectClassName="w-1/6" + buttonOrder={["query", "init", "excel"]} leftChildren={
{/*
*/} @@ -548,7 +560,7 @@ export default function PbnstPrfmncSttn() { selectArray={yearOptions} value={fromDate} onSelectValue={(val: string | number) => setFromDate(String(val))} /> - ~ + ~
} queryClick={function (returnType: ReturnType): void { - pbnstPrfmncSearch(returnType, pbnRuseNm ?? "", fromDate, toDate); + pbnstPrfmncSearch(1, returnType, pbnRuseNm ?? "", fromDate, toDate, fclts); if (fromDate && toDate) { const fromNum = Number(fromDate); const toNum = Number(toDate); @@ -594,6 +606,7 @@ export default function PbnstPrfmncSttn() { } } } + isResetPage(true) }} excelClick={excelClick} initClick={function (): void { }} @@ -608,13 +621,14 @@ export default function PbnstPrfmncSttn() { headName={undefined} tableData={bdstTable || []} headlist={pbnstPrfHeadList} - pageSize={20} - total={10000} + pageSize={5} + total={prfmncResCount} cellClick={(index: number | undefined, headId: string) => { cellClick(index ?? undefined, headId); }} - onPageChange={() => { }} + onPageChange={setPageNation} index={0} + resetPageNo={resetPage} />
@@ -653,32 +667,8 @@ export default function PbnstPrfmncSttn() {

하수재이용실적 현황 (단위: m³)

- {/* */} - {/* */} - {/*
-

- {"하수처리수재이용 실적(m³) 등록결과"} -

-
*/} - - {/* {}}> - */} - 0 ? "h-[60vh]" : ""}> - {/*
-

- {"하수재이용실적 현황 (단위: m³)"} -

-
*/} - {headMakeprfmnc(monthHeadList, [])} @@ -690,10 +680,7 @@ export default function PbnstPrfmncSttn() {
- {/*
*/}
- - {/* */} diff --git a/apps/wr/app/store/prfmncSttn/pbnstPrfmncSttn/index.tsx b/apps/wr/app/store/prfmncSttn/pbnstPrfmncSttn/index.tsx index b9c5c371c..727c1337d 100644 --- a/apps/wr/app/store/prfmncSttn/pbnstPrfmncSttn/index.tsx +++ b/apps/wr/app/store/prfmncSttn/pbnstPrfmncSttn/index.tsx @@ -4,11 +4,12 @@ import { monthSttnHeadListExport, pbnstPrfmncSttnHeadListExport, pbnstYearHeadLi import type { FcPrfType, PrfType } from "../../prfmncReg/pbnstPrfmncReg/type"; import type { pubHasuType, selectLabel } from "../../ruseFcltMng/fcltReg/pbnstReg/type"; import type { ReturnType } from "@common/business_components"; +import type { WaterReuseFacility } from "../../ruseFcltMng/fcltSttn/pbnstSttn/type"; type pbnstPrfmncSttnActions = { tableHeadMaker: (startYear: number, endYear: number) => void; - pbnstPrfmncInit: (page: string, sggOrCity: string) => void; - pbnstPrfmncSearch: (returnType: ReturnType, swtrmtFcltNm: string, fromDate: string, toDate: string) => void; + // pbnstPrfmncInit: (page: string, sggOrCity: string) => void; + pbnstPrfmncSearch: (page: number, returnType: ReturnType, fcltNm: string, fromDate: string, toDate: string, fclts: string[]) => void; } const pbnstPrfmncRes: PrfType[] = []; @@ -22,7 +23,9 @@ export type pbnstPrfmncSttnState = { isInit: boolean; rawData: any[]; selectYearList: selectLabel[] - monthSttnHeadList:TableUpperProps[]; + monthSttnHeadList: TableUpperProps[]; + fclts: string[]; + prfmncResCount: number; } } @@ -36,34 +39,75 @@ export const pbnstPrfmncSttnExport: pbnstPrfmncSttnState = { isInit: false, rawData: [], selectYearList: [], - monthSttnHeadList:monthSttnHeadListExport + monthSttnHeadList: monthSttnHeadListExport, + fclts: [], + prfmncResCount: 1, } } -const checkWrRegList = async () => { - const wrRegList = await getFetch("wr", `/reuseFc/pubDetailList`); - return wrRegList; -}; -const hasuListFetch = async (page: string, sggOrCity: string) => { - const checkWrRegListRes = await checkWrRegList(); - const rainRes = await postFectch( - `/prcsFclt/ruseInfo/${page ? page : 1}/10/A/${sggOrCity ? sggOrCity : "11"}/0/1/SW`, - checkWrRegListRes?.fcltCds, - fetchType.COMMON +const hasuListFetch = async ( + page: number, + returnType: ReturnType, + searchNm: string | undefined, + year: string, + flcts: string[] +) => { + let url = `/prcsFclt/ruseInfo/`; + + if (returnType.partValue === "A") { + url += `${page}/5/${returnType.partValue}/${ + // returnType.sidoValue ? returnType.sidoValue : returnType.sigunValue + returnType.sigunValue !== '0' ? returnType.sigunValue : returnType.sidoValue + }/0/1/SW` + } else if (returnType.partValue === "R") { + url += `${page}/5/${returnType.partValue}/${returnType.regionValue + ? returnType.regionValue + : returnType.unitWaterShedValue + ? returnType.unitWaterShedValue + : returnType.middleRegionValue + }/0/1/SW` + } else if (returnType.partValue === 'G') { + url += `${page}/5/${returnType.envPartValue}/${returnType.sigunValue !== '0' ? returnType.sigunValue : returnType.sidoValue}/0/1/SW` + + } else { + url += `1/2/A/0/0/1/SW` + } + + if (searchNm && searchNm?.length > 0) { + url += "/" + searchNm + } + + const pbnList = await postFectch(url, flcts, fetchType.COMMON); + const getRuseList = await postFectch( + `/reuseFc/pubDetailList/${year}`, + flcts, + fetchType.WR ); - const data = checkWrRegListRes.fcPrfList.map((item: FcPrfType) => { - const findData = rainRes.data.find( - (fclt: pubHasuType) => - fclt.bscFctCd === item.pbnstRuseFcltId.substring(0, 11) - ); - return { - sido: findData?.sido, - gugun: findData?.gugun, - bscFctNm: findData?.bscFctNm, - ruseUtztnFcltNm: item.ruseUtztnFcltNm, - pbnstRuseFcltId: item.pbnstRuseFcltId, - }; - }); + let count = 0; + const checkWrRegListRes = getRuseList.data; + const data: WaterReuseFacility[] = checkWrRegListRes.map( + (item: FcPrfType) => { + if (!item.prfList || item.prfList.length === 0) { + return null; + } + const findData = pbnList.data.find( + (fclt: pubHasuType) => + fclt.bscFctCd === item.pbnstRuseFcltId.substring(0, 11) + ); + if (findData) { + count++; + return { + sido: findData?.sido || '-', + gugun: findData?.gugun || '-', + bscFctNm: findData?.bscFctNm || '-', + ruseUtztnFcltNm: item?.ruseUtztnFcltNm || '-', + pbnstRuseFcltId: item?.pbnstRuseFcltId || '-', + bscFctCd: findData?.bscFctCd || '-', + count + } + } + } + ).filter(Boolean); return data; } @@ -71,6 +115,15 @@ export const pbnstPrfmncSttnActionsExport: (set: any) => pbnstPrfmncSttnActions set: any ) => { return { + getFlcts: async () => { + const fclts = await getFetch(fetchType.WR, '/reuseFc/pubFc') + return set((state: pbnstPrfmncSttnState) => ({ + pbnstPrfmncSttn: { + ...state.pbnstPrfmncSttn, + fclts: fclts + }, + })); + }, tableHeadMaker: (startYear: number, endYear: number) => { let yearHeader: TableUpperProps[] = [...pbnstPrfmncSttnHeadListExport]; const selectList = [] as unknown as selectLabel[] @@ -79,7 +132,7 @@ export const pbnstPrfmncSttnActionsExport: (set: any) => pbnstPrfmncSttnActions if (yearHead) { yearHead.forEach((item: { id?: string; }) => { if (item.id) { - if(item.id === "year") {item.id = ""; return;} + if (item.id === "year") { item.id = ""; return; } item.id = i + item.id; } }) @@ -100,117 +153,144 @@ export const pbnstPrfmncSttnActionsExport: (set: any) => pbnstPrfmncSttnActions }; }); }, - pbnstPrfmncInit: async (page: string, sggOrCity: string) => { + // pbnstPrfmncInit: async (page: string, sggOrCity: string) => { + // try { + // const prfmncRes = await hasuListFetch(page, sggOrCity); + // return set((state: pbnstPrfmncSttnState) => ({ + // ...state, + // pbnstPrfmncSttn: { + // ...state.pbnstPrfmncSttn, + // prfmncRes: prfmncRes, + // isInit: true, + // }, + // })); + // } catch (e) { + // console.log(e) + // } + // }, + pbnstPrfmncSearch: async (page: number, returnType: ReturnType, fcltNm: string, fromDate: string, toDate: string, fclts: string[]) => { try { - const prfmncRes = await hasuListFetch(page, sggOrCity); + const prfmncRes = await hasuListFetch( + page, + returnType, + fcltNm, + toDate, + fclts); + // const bscFctCdList = prfmncRes.map((item: any) => { + // return item.bscFctCd; + // }) + const bscFctCdList = prfmncRes + .map((item: any) => item.bscFctCd) + .filter((value, index, self) => self.indexOf(value) === index); + // const bscFctCdList = [...new Set(prfmncRes.map((item: any) => item.bscFctCd))]; + + + const res = await postFectch( + `/reuseFc/pubDetailList/${fromDate}/${toDate}`, + bscFctCdList, + `wr`, + ) + let inUsageSum = 0; + let outUsageSum = 0; + let year = ""; + const yearsData = [] as any + + res.data.forEach((item: any) => { + if (item.prfList.length === 0) { + const year: string = ""; // 연도 정보가 없으면 빈 문자열, 필요시 item에서 추출. + const yearVal: { [key: string]: any } = { year: year, pbnstRuseFcltId: item.pbnstRuseFcltId ?? "", ruseUtztnFcltNm: item.ruseUtztnFcltNm ?? "" }; + yearVal[`${year}inUsage`] = 0; + yearVal[`${year}outUsage`] = 0; + yearVal[`${year}total`] = 0; + yearsData.push(yearVal); + } + item.prfList.forEach((acc) => { + year = acc.ym?.substring(0, 4) ?? ""; + inUsageSum = + (acc.wshwtr ?? 0) + //조경용수 + (acc.coolUswtr ?? 0) + //냉각수 + (acc.cleanUswtr ?? 0) + //청소수 + (acc.drwtUswtr ?? 0) + //식수대 + (acc.dltnUswtr ?? 0) + //희석용수 + (acc.ithlRswtr ?? 0) + //중수도 + (acc.ithlEtcUswtr ?? 0) //기타 + outUsageSum = + (acc.cleanToilUswtr ?? 0) + //청소화장실용수 + (acc.resn ?? 0) + //세척살수용도 + (acc.lndwtr ?? 0) + //조경용수 + (acc.hydUswtr ?? 0) + //친수용수 + (acc.ugwtChr ?? 0) + //지하수충전 + (acc.farmUswtr ?? 0) + //농업용수 + (acc.rvrKeepUswtr ?? 0) + //하천등유지용수 + (acc.indstUswtr ?? 0); //공업용수 + const yearData = yearsData.find( + (yearItem) => + yearItem.year === year && + yearItem.pbnstRuseFcltId == acc.pbnstRuseFcltId + ); + + if (yearData) { + yearData[`${year}inUsage`] += inUsageSum; + yearData[`${year}outUsage`] += outUsageSum; + yearData[`${year}total`] += (inUsageSum + outUsageSum); + } else { + const yearVal: { [key: string]: any } = { year: year, pbnstRuseFcltId: acc.pbnstRuseFcltId, ruseUtztnFcltNm: item.ruseUtztnFcltNm ?? "" }; + yearVal[`${year}inUsage`] = inUsageSum; + yearVal[`${year}outUsage`] = outUsageSum; + yearVal[`${year}total`] = inUsageSum + outUsageSum; + yearsData.push(yearVal); + } + }); + }); + + // 연도 필터링 + const from = Number(fromDate); + const to = Number(toDate); + + // 연도별 실적을 시설별로 병합 + const mergedMap: { [key: string]: any } = {}; + + yearsData.forEach((acc) => { + const facilityId = acc.pbnstRuseFcltId; + const year = acc.year; + + // 연도 필터 범위 안에만 포함 + if (!year || Number(year) < from || Number(year) > to) return; + + if (!mergedMap[facilityId]) { + mergedMap[facilityId] = { + pbnstRuseFcltId: facilityId, + ruseUtztnFcltNm: acc.ruseUtztnFcltNm, + }; + } + + // 해당 연도 데이터 추가 + mergedMap[facilityId][`${year}inUsage`] = acc[`${year}inUsage`] ?? 0; + mergedMap[facilityId][`${year}outUsage`] = acc[`${year}outUsage`] ?? 0; + mergedMap[facilityId][`${year}total`] = acc[`${year}total`] ?? 0; + }); + + // prfmncRes 정보 merge + const resData = Object.values(mergedMap).map((item: any) => { + const match = prfmncRes.find((res) => res.pbnstRuseFcltId === item.pbnstRuseFcltId); + return match ? { ...item, ...match } : item; + }); + return set((state: pbnstPrfmncSttnState) => ({ ...state, pbnstPrfmncSttn: { ...state.pbnstPrfmncSttn, - prfmncRes: prfmncRes, - isInit: true, + // prfmncRes: prfmncRes, + prfmncResCount: fclts.length - 5, + isInit: false, + prfmncRes: resData, + rawData: res.data }, })); - } catch (e) { - console.log(e) + } catch (errorHasu) { + console.log(errorHasu); } }, - pbnstPrfmncSearch: async (returnType: ReturnType, swtrmtFcltNm: string, fromDate: string, toDate: string) => { - let searchUrl = ""; - if (returnType.sigunValue !== "0") { - if (swtrmtFcltNm !== "") { - searchUrl = `/prcsFclt/info/1/20/${returnType.partValue}/${returnType.sigunValue}/0/1/SW${'/' + swtrmtFcltNm}`; - } else { - searchUrl = `/prcsFclt/info/1/20/${returnType.partValue}/${returnType.sigunValue}/0/1/SW`; - } - } else { - if (swtrmtFcltNm !== "") { - searchUrl = `/prcsFclt/info/1/20/${returnType.partValue}/${returnType.sidoValue}/0/1/SW${'/' + swtrmtFcltNm}`; - } else { - searchUrl = `/prcsFclt/info/1/20/${returnType.partValue}/${returnType.sidoValue}/0/1/SW`; - } - } - const pbnstRes = await getFetch( - fetchType.COMMON, - searchUrl - ); - - const bscFctCdList = pbnstRes.map((item: any) => { - return item.bscFctCd; - }) - const res = await postFectch( - `/reuseFc/pubDetailList/${fromDate}/${toDate}`, - bscFctCdList, - `wr`, - ) - let inUsageSum = 0; - let outUsageSum = 0; - let year = ""; - const yearsData = [] as any - - res.data.forEach((item : any) => { - if (item.prfList.length === 0) { - const year: string = ""; // 연도 정보가 없으면 빈 문자열, 필요시 item에서 추출. - const yearVal: { [key: string]: any } = { year: year, pbnstRuseFcltId: item.pbnstRuseFcltId ?? "", ruseUtztnFcltNm : item.ruseUtztnFcltNm ?? "" }; - yearVal[`${year}inUsage`] = 0; - yearVal[`${year}outUsage`] = 0; - yearVal[`${year}total`] = 0; - yearsData.push(yearVal); - } - item.prfList.forEach((acc) => { - year = acc.ym?.substring(0, 4) ?? ""; - inUsageSum = - (acc.wshwtr ?? 0) + //조경용수 - (acc.coolUswtr ?? 0) + //냉각수 - (acc.cleanUswtr ?? 0) + //청소수 - (acc.drwtUswtr ?? 0) + //식수대 - (acc.dltnUswtr ?? 0) + //희석용수 - (acc.ithlRswtr ?? 0) + //중수도 - (acc.ithlEtcUswtr ?? 0) //기타 - outUsageSum = - (acc.cleanToilUswtr ?? 0) + //청소화장실용수 - (acc.resn ?? 0)+ //세척살수용도 - (acc.lndwtr ?? 0) + //조경용수 - (acc.hydUswtr ?? 0) + //친수용수 - (acc.ugwtChr ?? 0) + //지하수충전 - (acc.farmUswtr ?? 0) + //농업용수 - (acc.rvrKeepUswtr ?? 0) + //하천등유지용수 - (acc.indstUswtr ?? 0); //공업용수 - const yearData = yearsData.find( - (yearItem) => - yearItem.year === year && - yearItem.pbnstRuseFcltId == acc.pbnstRuseFcltId - ); - - if (yearData) { - yearData[`${year}inUsage`] += inUsageSum; - yearData[`${year}outUsage`] += outUsageSum; - yearData[`${year}total`] += (inUsageSum + outUsageSum); - } else { - const yearVal: { [key: string]: any } = { year: year, pbnstRuseFcltId: acc.pbnstRuseFcltId, ruseUtztnFcltNm : item.ruseUtztnFcltNm ?? "" }; - yearVal[`${year}inUsage`] = inUsageSum; - yearVal[`${year}outUsage`] = outUsageSum; - yearVal[`${year}total`] = inUsageSum + outUsageSum; - yearsData.push(yearVal); - } - }); - }); - const resData: any[] = [] - pbnstRes.forEach((acc) => { - const data = yearsData.find((item) => item.pbnstRuseFcltId.substring(0, 11) === acc.bscFctCd) - if (data) { - resData.push({ ...acc, ...data }) - } - }) - return set((state: pbnstPrfmncSttnState) => ({ - ...state, - pbnstPrfmncSttn: { - ...state.pbnstPrfmncSttn, - prfmncRes: resData, - rawData: res.data - }, - })); - } } } \ No newline at end of file diff --git a/apps/wr/components/ui/modal/sttn/sttnDetailModal/coDatailModal.tsx b/apps/wr/components/ui/modal/sttn/sttnDetailModal/coDatailModal.tsx index def5d2cab..cb38717a3 100644 --- a/apps/wr/components/ui/modal/sttn/sttnDetailModal/coDatailModal.tsx +++ b/apps/wr/components/ui/modal/sttn/sttnDetailModal/coDatailModal.tsx @@ -48,10 +48,10 @@ export default function CoDetailModal({ return (
- +
-
+

잠재수요처 상세정보

From 0ad7d6a2c4c8d7585d6a5b053444dd6c2b35b710 Mon Sep 17 00:00:00 2001 From: jyha00 Date: Sat, 26 Jul 2025 15:58:47 +0900 Subject: [PATCH 02/10] =?UTF-8?q?searchBaseForm=20=EB=B2=84=ED=8A=BC=20?= =?UTF-8?q?=EC=88=9C=EC=84=9C=20=EB=B3=80=EA=B2=BD=20=ED=8C=8C=EB=9D=BC?= =?UTF-8?q?=EB=AF=B8=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/ui/chart/DoubleBar.tsx | 1 - .../src/ui/search_base_form/index.tsx | 38 ++++++++++++++----- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/packages/common/business_components/src/ui/chart/DoubleBar.tsx b/packages/common/business_components/src/ui/chart/DoubleBar.tsx index 9627485aa..be930f3af 100644 --- a/packages/common/business_components/src/ui/chart/DoubleBar.tsx +++ b/packages/common/business_components/src/ui/chart/DoubleBar.tsx @@ -83,7 +83,6 @@ export default function DoubleBarChart({chartConfig=undefined, chartData=[], cha .map(key => item[key]) ).flat()); }; - console.log(chartData); const barMaxValue = getMaxValue(chartData, 'barVal'); return ( <> diff --git a/packages/common/business_components/src/ui/search_base_form/index.tsx b/packages/common/business_components/src/ui/search_base_form/index.tsx index cd26f7742..f99963f14 100644 --- a/packages/common/business_components/src/ui/search_base_form/index.tsx +++ b/packages/common/business_components/src/ui/search_base_form/index.tsx @@ -24,6 +24,7 @@ type SearchBaseType = { rightClassName?: string; leftClassName?: string; leftSelectClassName?: string; + buttonOrder?: ("query" | "init" | "excel")[]; } export type ReturnType = { partValue: string; @@ -55,7 +56,8 @@ function SearchBaseForm ({ isAdmin=false, rightClassName, leftClassName, - leftSelectClassName + leftSelectClassName, + buttonOrder }: SearchBaseType) { const [partValue, setPartValue] = useState("A"); const [sidoValue, setSidoValue] = useState("0"); @@ -67,6 +69,30 @@ function SearchBaseForm ({ const [middleRegionValue, setMiddleRegionValue] = useState("0"); const [envPartValue, setEnvPartValue] = useState("0"); const [resetTrigger, setResetTrigger] = useState(false); + const renderButton = (type: "query" | "init" | "excel") => { + switch (type) { + case "query": + return ( + + ); + case "init": + return ( + + ); + case "excel": + return ( + + ); + default: + return null; + } + }; const queryVal = () => { console.log("조회버튼 클릭"); queryClick({ @@ -145,16 +171,8 @@ function SearchBaseForm ({ {leftChildren} -
- - + {(buttonOrder ?? ["excel", "init", "query"]).map(renderButton)}
{rightChildren}
From 9d101666ab16fa7fa764056c265a4f576bad3678 Mon Sep 17 00:00:00 2001 From: jwpark Date: Sat, 26 Jul 2025 16:46:19 +0900 Subject: [PATCH 03/10] =?UTF-8?q?main=20=EB=A8=B8=EC=A7=80=20=EC=9D=B4?= =?UTF-8?q?=EC=8A=88=EB=A1=9C=20=EC=88=98=EC=A0=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business_components/src/ui/map/Gis.js | 123 +++++++++++++++++- 1 file changed, 119 insertions(+), 4 deletions(-) diff --git a/packages/common/business_components/src/ui/map/Gis.js b/packages/common/business_components/src/ui/map/Gis.js index 4969795af..0e2c4bf7e 100644 --- a/packages/common/business_components/src/ui/map/Gis.js +++ b/packages/common/business_components/src/ui/map/Gis.js @@ -13,6 +13,7 @@ import GisToolBar from './GisToolBar'; import GisTree from './GisTree'; import './lib/css/gis.common.css'; import GisApp from './lib/gis.core'; +// import FacilityInfoPopup from './FacilityInfoPopup'; export const GisContext = createContext({ gisCore: null, gisMap: null, treeData: null, checkedLayerIds: null }); export const useGisContext = () => useContext(GisContext); @@ -99,10 +100,8 @@ function Gis({ detailView: DetailView, onFeatureSelect, setIsSearchModalOpen, - onCheckedLayersChange, - setData + onCheckedLayersChange }) { - const mapRef = useRef(); const [mapObject, setMapObject] = useState({}); const [tabVisible, setTabVisible] = useState(true); @@ -219,7 +218,6 @@ function Gis({ // 지도 생성 및 초기화 useEffect(() => { - if (!mapRef.current) return; if (mapInstanceRef.current) return; // 이미 생성된 맵이 있다면 중단 @@ -326,6 +324,120 @@ function Gis({ } } + // // 데이터 로드 및 팝업 생성 로직 + // useEffect(() => { + // if (!mapInstanceRef.current) return; // 맵이 생성되지 않았으면 실행 안 함 + + // // 1. 팝업 데이터 가져오기 (feature.js의 getData와 유사) + // const fetchPopupData = async () => { + // // 실제 API 호출 로직으로 대체해야 합니다. + // // 예시: const response = await yourApiService.getFcltyWtCnt(); + // // setFacilityInfoPopupData(response.data); + + // // 임시 목업 데이터 + // const mockData = [ + // { ftrIdn: 1, ftrCde: 'SA206', bplcNm: '처리장A', fcltyUseYn: 'Y', x: 127.005, y: 37.282, aCnt: 10, cCnt: 5, eCnt: 3, mCnt: 8, iCnt: 2 }, + // { ftrIdn: 2, ftrCde: 'SA112', bplcNm: '처리장B', fcltyUseYn: 'N', x: 127.010, y: 37.285, aCnt: 8, cCnt: 4, eCnt: 2, mCnt: 6, iCnt: 1 } + // ]; + // setFacilityInfoPopupData(mockData); + // }; + + // fetchPopupData(); + + // }, [mapInstanceRef.current]); // 맵 인스턴스가 생성된 후 한 번만 실행 + + // // 데이터가 변경되면 오버레이를 생성/업데이트하는 로직 + // useEffect(() => { + // const map = mapInstanceRef.current; + // if (!map || facilityInfoPopupData.length === 0) return; + + // // 기존 오버레이 정리 + // facilityOverlaysRef.current.forEach(overlay => map.removeOverlay(overlay)); + // facilityOverlaysRef.current = []; + + // facilityInfoPopupData.forEach(data => { + // const popupId = `${data.ftrIdn}_${data.ftrCde}`; + + // // 팝업을 담을 div 엘리먼트 생성 + // const popupElement = document.createElement('div'); + // popupElement.id = popupId; + + // // OpenLayers Overlay 생성 + // const position = olProj.transform([Number(data.x), Number(data.y)], GisApp.FROM_PROJ, GisApp.TO_PROJ); + // const overlay = new Overlay({ + // element: popupElement, + // position: position, + // offset: [-75, -210], // 팝업 너비의 절반, 높이만큼 오프셋 조정 + // positioning: 'bottom-center', + // className: 'facility-popup-overlay' // 필요시 공통 클래스 추가 + // }); + + // map.addOverlay(overlay); + // facilityOverlaysRef.current.push(overlay); + + // // React 컴포넌트를 popupElement에 렌더링 + // const root = createRoot(popupElement); + // root.render(); + // }); + + // // 초기 가시성 업데이트 + // updatePopupVisibility(); + + // }, [facilityInfoPopupData]); // 팝업 데이터가 변경될 때마다 실행 + + // // 레이어 가시성에 따라 팝업 가시성을 제어하는 함수 + // const updatePopupVisibility = useCallback(() => { + // const map = mapInstanceRef.current; + // if (!map) return; + + // const visibleLayers = new Set(); + // map.getLayers().forEach(layer => { + // if (layer.getVisible()) { + // // feature.js의 로직처럼 typeName이나 ftrCde를 사용해 필터링 + // const typeName = layer.get('typeName'); + // if (typeName === 'VW_WTL_FCLTY_AS') { // 예시 레이어 이름 + // visibleLayers.add(layer.get('ftrCde')); + // } + // } + // }); + + // facilityOverlaysRef.current.forEach(overlay => { + // const element = overlay.getElement(); + // const ftrCde = element.querySelector('table')?.classList[0]; // FacilityPopup의 클래스에서 ftrCde 가져오기 + + // if (visibleLayers.has(ftrCde)) { + // element.style.display = ''; + // } else { + // element.style.display = 'none'; + // } + // }); + // }, []); + + // GisTree에서 체크 상태가 변경될 때 이 함수를 호출하도록 연결해야 합니다. + // 예시: GisTree 컴포넌트에 onCheck 콜백을 추가하고, 그 콜백에서 이 함수를 호출 + // useEffect(() => { + // // 레이어 가시성이 변경될 때마다 팝업 가시성 업데이트 + // const map = mapInstanceRef.current; + // if (!map) return; + + // const handleLayerVisibilityChange = () => { + // updatePopupVisibility(); + // }; + + // map.getLayers().on('change:length', handleLayerVisibilityChange); + // map.getLayers().forEach(layer => { + // layer.on('change:visible', handleLayerVisibilityChange); + // }); + + // return () => { + // // 클린업 + // map.getLayers().un('change:length', handleLayerVisibilityChange); + // map.getLayers().forEach(layer => { + // layer.un('change:visible', handleLayerVisibilityChange); + // }); + // }; + // }, [updatePopupVisibility]); + // 체크된 레이어 정보를 처리하는 함수 const handleCheckedLayersChange = useCallback((checkedIds, checkedNodesData) => { setTimeout(() => { @@ -354,6 +466,8 @@ function Gis({ imageVisible={imgVisble} /> + {/* */} + {/* DetailView가 존재할 때만 렌더링 isSearchModalOpen이 true면 visible=false로 팝업 숨김 */} {isOpen && !isSearchModalOpen && ( )} + {/* */} From 024f25f003ed5556c8033317904ae7b10237a49e Mon Sep 17 00:00:00 2001 From: leedj312 Date: Sat, 26 Jul 2025 17:01:44 +0900 Subject: [PATCH 04/10] =?UTF-8?q?=EC=88=98=EC=9A=94=EC=B2=98=20=EA=B2=80?= =?UTF-8?q?=ED=86=A0=20=EB=B0=8F=20env=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/.env.development | 4 +- apps/wr/.env.local | 3 +- apps/wr/.env.production | 64 +++++++-------- apps/wr/app/matMng/coMat/coMatRvw/page.tsx | 82 ++++++------------- apps/wr/app/store/matDmd/coMatRvw/type.tsx | 13 +++ apps/wr/components/lib/config/index.ts | 4 +- .../ui/form/coMat/conCostForm/conCostForm.tsx | 12 ++- apps/wr/src/shared/config/env.ts | 2 +- 8 files changed, 87 insertions(+), 97 deletions(-) diff --git a/apps/wr/.env.development b/apps/wr/.env.development index 1126c07ec..00673e11b 100644 --- a/apps/wr/.env.development +++ b/apps/wr/.env.development @@ -13,8 +13,8 @@ NEXT_PUBLIC_SITE_ID = WR NEXT_PUBLIC_PORT = 11301 NEXT_PUBLIC_PROXY_HOST = http://con.mind-one.co.kr:11301 -# NEXT_PUBLIC_SERVER_API_URL = http://dev.onasys.co.kr:8000 -NEXT_PUBLIC_SERVER_API_URL = http://con.mind-one.co.kr:11080/api/v1 + NEXT_PUBLIC_SERVER_API_URL = http://dev.onasys.co.kr:8000 +NEXT_PUBLIC_WR_SERVER_API_URL = http://con.mind-one.co.kr:11080/api/v1 NEXT_PUBLIC_FO_SERVER_API_URL = http://con.mind-one.co.kr:11082/api/v1 NEXT_PUBLIC_CS_SERVER_API_URL = http://dev.onasys.co.kr:8000 NEXT_PUBLIC_CS_TUS_UPLOAD = /attach-service/api/v1/tus/upload diff --git a/apps/wr/.env.local b/apps/wr/.env.local index 262ffc33e..3aeb07e2e 100644 --- a/apps/wr/.env.local +++ b/apps/wr/.env.local @@ -1,7 +1,8 @@ NEXT_PUBLIC_SITE_ID = WR NEXT_PUBLIC_PORT = 3001 NEXT_PUBLIC_PROXY_HOST = http://localhost:3001 -NEXT_PUBLIC_SERVER_API_URL = http://con.mind-one.co.kr:11080/api/v1 +NEXT_PUBLIC_WR_SERVER_API_URL = http://con.mind-one.co.kr:11080/api/v1 +NEXT_PUBLIC_SERVER_API_URL=http://dev.onasys.co.kr:8000 NEXT_PUBLIC_FO_SERVER_API_URL = http://con.mind-one.co.kr:11082/api/v1 NEXT_PUBLIC_CS_SERVER_API_URL = http://dev.onasys.co.kr:8000 NEXT_PUBLIC_CS_TUS_UPLOAD = /attach-service/api/v1/tus/upload diff --git a/apps/wr/.env.production b/apps/wr/.env.production index 64066e879..97342cf20 100644 --- a/apps/wr/.env.production +++ b/apps/wr/.env.production @@ -1,39 +1,39 @@ -# NEXT_PUBLIC_SITE_ID = WR -# NEXT_PUBLIC_PORT = 3000 -# NEXT_PUBLIC_PROXY_HOST = http://wr.hasuon.or.kr -# NEXT_PUBLIC_SERVER_API_URL = http://apigateway.iipbs-dev.svc.cluster.local:8000/api/v1 -# NEXT_PUBLIC_FO_SERVER_API_URL = http://apigateway.iipbs-dev.svc.cluster.local:8000/operation-service/api/v1 -# NEXT_PUBLIC_CS_SERVER_API_URL = http://apigateway.iipbs-dev.svc.cluster.local:8000 -# NEXT_PUBLIC_CS_TUS_UPLOAD = /attach-service/api/v1/tus/upload -# NEXT_PUBLIC_GEOSERVER_URL = http://172.29.143.87:8080/geoserver -# NEXT_PUBLIC_LX_GEOSERVER_URL = http://172.29.143.87:8080/geoserver_swl -# NEXT_PUBLIC_CLAIM_NAME = Authorization -# NEXT_PUBLIC_AUTH_USER_ID = token-id -# NEXT_PUBLIC_ACCESS_TOKEN = access-token -# NEXT_PUBLIC_REFRESH_TOKEN = refresh-token - -# NEXT_PUBLIC_SEWERAGE_API_URL = http://apigateway.iipbs-dev.svc.cluster.local:8000/sewerage-service/api - - - - - - - - NEXT_PUBLIC_SITE_ID = WR -NEXT_PUBLIC_PORT = 11301 -NEXT_PUBLIC_PROXY_HOST = http://con.mind-one.co.kr:11301 -# NEXT_PUBLIC_SERVER_API_URL = http://dev.onasys.co.kr:8000 -NEXT_PUBLIC_SERVER_API_URL = http://con.mind-one.co.kr:11080/api/v1 -NEXT_PUBLIC_FO_SERVER_API_URL = http://con.mind-one.co.kr:11082/api/v1 -NEXT_PUBLIC_CS_SERVER_API_URL = http://dev.onasys.co.kr:8000 +NEXT_PUBLIC_PORT = 3000 +NEXT_PUBLIC_PROXY_HOST = http://wr.hasuon.or.kr +NEXT_PUBLIC_SERVER_API_URL = http://apigateway.iipbs-dev.svc.cluster.local:8000/api/v1 +NEXT_PUBLIC_FO_SERVER_API_URL = http://apigateway.iipbs-dev.svc.cluster.local:8000/operation-service/api/v1 +NEXT_PUBLIC_CS_SERVER_API_URL = http://apigateway.iipbs-dev.svc.cluster.local:8000 NEXT_PUBLIC_CS_TUS_UPLOAD = /attach-service/api/v1/tus/upload -NEXT_PUBLIC_GEOSERVER_URL = http://rsone.iptime.org:10010/geoserver -NEXT_PUBLIC_LX_GEOSERVER_URL = http://con.mind-one.co.kr:11306/geoserver +NEXT_PUBLIC_GEOSERVER_URL = http://172.29.143.87:8080/geoserver +NEXT_PUBLIC_LX_GEOSERVER_URL = http://172.29.143.87:8080/geoserver_swl NEXT_PUBLIC_CLAIM_NAME = Authorization NEXT_PUBLIC_AUTH_USER_ID = token-id NEXT_PUBLIC_ACCESS_TOKEN = access-token NEXT_PUBLIC_REFRESH_TOKEN = refresh-token -NEXT_PUBLIC_SEWERAGE_API_URL=http://con.mind-one.co.kr:11083/sewerage-service/api # 개발 서버 API +NEXT_PUBLIC_SEWERAGE_API_URL = http://apigateway.iipbs-dev.svc.cluster.local:8000/sewerage-service/api + + + + + + + + +# NEXT_PUBLIC_SITE_ID = WR +# NEXT_PUBLIC_PORT = 11301 +# NEXT_PUBLIC_PROXY_HOST = http://con.mind-one.co.kr:11301 +# # NEXT_PUBLIC_SERVER_API_URL = http://dev.onasys.co.kr:8000 +# NEXT_PUBLIC_SERVER_API_URL = http://con.mind-one.co.kr:11080/api/v1 +# NEXT_PUBLIC_FO_SERVER_API_URL = http://con.mind-one.co.kr:11082/api/v1 +# NEXT_PUBLIC_CS_SERVER_API_URL = http://dev.onasys.co.kr:8000 +# NEXT_PUBLIC_CS_TUS_UPLOAD = /attach-service/api/v1/tus/upload +# NEXT_PUBLIC_GEOSERVER_URL = http://rsone.iptime.org:10010/geoserver +# NEXT_PUBLIC_LX_GEOSERVER_URL = http://con.mind-one.co.kr:11306/geoserver +# NEXT_PUBLIC_CLAIM_NAME = Authorization +# NEXT_PUBLIC_AUTH_USER_ID = token-id +# NEXT_PUBLIC_ACCESS_TOKEN = access-token +# NEXT_PUBLIC_REFRESH_TOKEN = refresh-token + +# NEXT_PUBLIC_SEWERAGE_API_URL=http://con.mind-one.co.kr:11083/sewerage-service/api # 개발 서버 API diff --git a/apps/wr/app/matMng/coMat/coMatRvw/page.tsx b/apps/wr/app/matMng/coMat/coMatRvw/page.tsx index 8a965211c..ff35b95c5 100644 --- a/apps/wr/app/matMng/coMat/coMatRvw/page.tsx +++ b/apps/wr/app/matMng/coMat/coMatRvw/page.tsx @@ -617,63 +617,31 @@ export default function CoMatRvw() {

공급처 후보지

-
- ( - - { - field.onChange(String(e.target.value)); - }} - value={field.value ?? ""} - readOnly - /> - - )} - /> -
-
- ( - - { - field.onChange(e.target.value); - }} - value={field.value ?? ""} - readOnly - /> - - )} - /> -
-
- ( - - { - field.onChange(e.target.value); - }} - value={field.value ?? ""} - readOnly - /> - - )} - /> -
+ {[0, 1, 2].map((idx) => ( +
+ ( + + { + const newValue = { + ...(field.value || {}), + ruseUtztnFcltNm: e.target.value, + }; + field.onChange(newValue); + }} + value={field.value?.ruseUtztnFcltNm ?? ""} + readOnly + /> + + )} + /> +
+ ))}
{ toast.dismiss(t.id); + coMatRvwUpdate( - "11000SW001R1", + pk, form.getValues("dmdInfoId"), data ); @@ -194,12 +199,15 @@ export default function ConCostForm({ )); } else { - coMatRvwUpdate("11000SW001R1", form.getValues("dmdInfoId"), data); + + coMatRvwUpdate(pk, form.getValues("dmdInfoId"), data); } } } else if (type === "hist") { delete value.totalConstCost; delete value.ruseUtztnFcltNm; + console.log("onSubmit data ", pk); + ruseRvwCalUpdate(value); } }; diff --git a/apps/wr/src/shared/config/env.ts b/apps/wr/src/shared/config/env.ts index 49cc16b3a..acd0e25e2 100644 --- a/apps/wr/src/shared/config/env.ts +++ b/apps/wr/src/shared/config/env.ts @@ -1,7 +1,7 @@ export const SITE_ID = process.env.NEXT_PUBLIC_SITE_ID || "WR"; export const PORT = process.env.NEXT_PUBLIC_PORT || "3001"; export const PROXY_HOST = process.env.NEXT_PUBLIC_PROXY_HOST || `http://localhost:${PORT}`; -export const SERVER_API_URL = process.env.NEXT_PUBLIC_SERVER_API_URL ||'http://con.mind-one.co.kr:11080/api/v1'; +export const SERVER_API_WR_URL = process.env.NEXT_PUBLIC_WR_SERVER_API_URL ||'http://con.mind-one.co.kr:11080/api/v1'; export const SERVER_API_FO_URL = process.env.NEXT_PUBLIC_FO_SERVER_API_URL||' http://con.mind-one.co.kr:11082/api/v1'; export const SERVER_API_CS_URL = process.env.NEXT_PUBLIC_CS_SERVER_API_URL||'http://dev.onasys.co.kr:8000'; export const SERVER_API_CS_TUS_URL = process.env.NEXT_PUBLIC_CS_TUS_UPLOAD ||'/attach-service/api/v1/tus/upload' From a09e7fc709995b7ce29058d45dec4a614671d145 Mon Sep 17 00:00:00 2001 From: jyha00 Date: Sat, 26 Jul 2025 17:20:54 +0900 Subject: [PATCH 05/10] =?UTF-8?q?=EC=9E=AC=EC=9D=B4=EC=9A=A9=EC=8B=A4?= =?UTF-8?q?=EC=A0=81=20=ED=98=84=ED=99=A9=20=ED=85=8C=EC=9D=B4=EB=B8=94=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prfmncSttn/pbnstPrfmncSttn/page.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx b/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx index ae923df58..3f26e7f83 100644 --- a/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx @@ -101,11 +101,12 @@ export default function PbnstPrfmncSttn() { })); const inSubtotal = { ...structuredClone(subTotalObj), 구분: "장내용수" }; const outSubtotal = { ...structuredClone(subTotalObj), 구분: "장외용수" }; - - const prfFilter = prfList?.filter((e) => e.ym.slice(0, 4) === year) + const prfFilter = prfList?.filter((e) => + e.ym.slice(0, 4) === year + ) if (prfList && prfFilter.length > 0) { - prfList?.forEach((prfItem) => { + prfFilter.forEach((prfItem) => { const month = Number(prfItem?.ym?.slice(4)); // "MM" const monthKey = `${month}월`; @@ -151,6 +152,7 @@ export default function PbnstPrfmncSttn() { const tableData = [...inUsageData, ...outUsageData, usageTotalObj]; setPrfData(tableData); setExcelData(excelPrfmncSttnParsing(prfData ?? [])) + // }); } else { setPrfData([]); } @@ -212,9 +214,10 @@ export default function PbnstPrfmncSttn() { rawData.forEach((item) => { // 실적 테이블 데이터 if (chartId) { - if (item.prfList?.[0]?.ym.slice(0, 4) === year && item.prfList?.[0]?.pbnstRuseFcltId === chartId) { + if (item.prfList.find((e) => e.ym.slice(0, 4) === year) && item.prfList?.[0]?.pbnstRuseFcltId === chartId) { prfTableData(item.prfList, year); } + item.prfList.filter((e) => e.ym.slice(0, 4) === year && e.pbnstRuseFcltId === chartId).forEach((element) => { // 누적 wshwtr += element.wshwtr; @@ -438,7 +441,6 @@ export default function PbnstPrfmncSttn() { } }, [inLineData]); - useEffect(() => { if (outLineData?.chartData1) { const newChartConfig = { @@ -514,8 +516,6 @@ export default function PbnstPrfmncSttn() { if (prfmncRes?.[0]?.pbnstRuseFcltId) setChartId(prfmncRes[0].pbnstRuseFcltId) }, [prfmncRes]); - - useEffect(() => { if (pbnRuseNm.length > 1) pbnNmSearch("1", "23", ref.current, pbnRuseNm, searchYear, []); From 49961db9a9904476a396f6efdfcbb092f7f111cf Mon Sep 17 00:00:00 2001 From: jyha00 Date: Sat, 26 Jul 2025 18:16:46 +0900 Subject: [PATCH 06/10] =?UTF-8?q?=EC=B0=A8=ED=8A=B8=EB=B3=84=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=EB=90=9C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=97=86?= =?UTF-8?q?=EC=9D=84=20=EC=8B=9C=20=EC=95=88=EB=82=B4=EB=AC=B8=EA=B5=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prfmncSttn/pbnstPrfmncSttn/page.tsx | 46 ++++++++++++++++--- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx b/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx index 3f26e7f83..c958bfc93 100644 --- a/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx @@ -645,26 +645,58 @@ export default function PbnstPrfmncSttn() {
- + {chartData.find((e) => e.val > 0) ? + + : +
+ 조회된 장내·외 용수 총 실적(m³) 데이터가 없습니다. +
}
- + {dnInUsage.find((e) => e.val > 0) ? + + : +
+ 조회된 장내용수 실적(m³) 데이터가 없습니다. +
}
- + {dnOutUsage.find((e) => e.val > 0) ? + + : +
+ 조회된 장외용수 실적(m³) 데이터가 없습니다. +
}
+

장내·외 월별 하수재이용실적 현황

- + {barData.length > 0 ? + + : +
+ 조회된 월별 장내·외 용수 총 실적(m³) 데이터가 없습니다. +
}
- + {inLineData && Object.values(inLineData).every(arr => Array.isArray(arr) && arr.length === 0) ? +
+ 조회된 월별 장내 용수 실적(m³) 데이터가 없습니다. +
+ : + + }
- -
+ {outLineData && Object.values(outLineData).every(arr => Array.isArray(arr) && arr.length === 0) ? +
+ 조회된 월별 장외 용수 총 실적(m³) 데이터가 없습니다. +
+ : + + }

하수재이용실적 현황 (단위: m³)

From 4be7354b36082993c69f3fd4690cb94eb1c3ed29 Mon Sep 17 00:00:00 2001 From: jyha00 Date: Sat, 26 Jul 2025 19:24:38 +0900 Subject: [PATCH 07/10] =?UTF-8?q?=EC=8B=9C=EC=84=A4=EB=AA=85=20input=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prfmncSttn/pbnstPrfmncSttn/page.tsx | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx b/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx index c958bfc93..cd451b783 100644 --- a/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx @@ -6,8 +6,7 @@ import { initValInUsage, initValOutUsage, subTotalObj, totalObj, type FcPrfType, import { excelPrfmncSttnParsing } from "@/app/store/prfmncSttn/pbnstPrfmncSttn/excel"; import { excelDownload, yearOptions } from "@/components/lib/func/commom"; import { InputTableBody } from "@/components/lib/func/TableData"; -import SearchInputText from "@/components/ui/searchInput/searchInput"; -import { CHART_FORM, ContentsDiv, MainChart, ScrollArea, SearchBaseForm, SelectBox, Title, UiTable, type ChartConfig, type ReturnType } from "@common/business_components"; +import { CHART_FORM, ContentsDiv, MainChart, ScrollArea, SearchBaseForm, SearchInput, SelectBox, Title, UiTable, type ChartConfig, type ReturnType } from "@common/business_components"; import ListDiv from "@common/business_components/ui/list_div"; import { Label, Table, TableBody, TableHeader } from "@common/components/ui"; import { useCallback, useEffect, useRef, useState } from "react"; @@ -24,7 +23,6 @@ export default function PbnstPrfmncSttn() { pbnstPrfmncSearch, getFlcts, prfmnc, - pbnstSttn, pbnNmSearch } = useWrStore((state) => state); const { monthHeadList } = prfmnc @@ -42,6 +40,7 @@ export default function PbnstPrfmncSttn() { const [excelData, setExcelData] = useState([]); const [pageNation, setPageNation] = useState(1); const [resetPage, isResetPage] = useState(false); + const excelClick = useCallback(() => { if (!excelData || excelData.length === 0) { toast.error(t('excelDownErrMsg')); @@ -526,7 +525,6 @@ export default function PbnstPrfmncSttn() { setChartId(prfmncRes[index].pbnstRuseFcltId) } } - return ( <> @@ -569,18 +567,16 @@ export default function PbnstPrfmncSttn() { selectArray={yearOptions} value={toDate} onSelectValue={(val: string | number) => setToDate(String(val))} /> + +
- { - setPbnRuseNm(searchNm || ""); - }} - setRtnData={/*function (rtnData: any[]): void {setbdstTable(rtnData);}*/ - () => { } - } - searchList={pbnstSttn.pbnstSearchData || []} - > {/* Date: Sat, 26 Jul 2025 19:25:19 +0900 Subject: [PATCH 08/10] =?UTF-8?q?UiTable=20index=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/ui/table/index.tsx | 53 ++++++++++--------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/packages/common/business_components/src/ui/table/index.tsx b/packages/common/business_components/src/ui/table/index.tsx index 4f369dc59..c3f5f8a60 100644 --- a/packages/common/business_components/src/ui/table/index.tsx +++ b/packages/common/business_components/src/ui/table/index.tsx @@ -81,6 +81,8 @@ export function UiTable({ const handlePageChange = (page: number) => { setCur(page); onPageChange(page); + if (index == 0) + setIdx(0) }; const handleCellClick = (index: number, headId: string) => { @@ -90,6 +92,7 @@ export function UiTable({ } }; + return ( <> {headName ? ( @@ -116,14 +119,13 @@ export function UiTable({ head.id.length > 1 && (boldArray.includes(index) ? ( handleCellClick(index, head.id)} key={`cell-${head.id}-${index}`} > @@ -131,39 +133,38 @@ export function UiTable({ ? String(el[head.id] ?? "") : String(el[head.id]).includes(".") ? String(el[head.id]) - .split(".") - .map((part, index) => - index === 0 - ? part.replace( - /\B(?=(\d{3})+(?!\d))/g, - ",", - ) - : part, - ) - .join(".") + .split(".") + .map((part, index) => + index === 0 + ? part.replace( + /\B(?=(\d{3})+(?!\d))/g, + ",", + ) + : part, + ) + .join(".") : String(el[head.id] ?? "").replace( - /\B(?=(\d{3})+(?!\d))/g, - ",", - )} + /\B(?=(\d{3})+(?!\d))/g, + ",", + )} ) : ( handleCellClick(index, head.id)} key={`cell-${head.id}-${index}`} > { //체크박스 유형애서 readOnly가 필요한 경우를 위해서 ChkClass 를 사용해서 readOnly 처리함. typeof el[head.id] === "object" && - el[head.id] !== null && - "chk" in (el[head.id] as object) && - "readonly" in (el[head.id] as object) ? ( + el[head.id] !== null && + "chk" in (el[head.id] as object) && + "readonly" in (el[head.id] as object) ? ( index === 0 ? part.replace( - /\B(?=(\d{3})+(?!\d))/g, - ",", - ) + /\B(?=(\d{3})+(?!\d))/g, + ",", + ) : part, ) .join(".") From f087e55c3c5c09d389a705f0896e9e414284f8e2 Mon Sep 17 00:00:00 2001 From: leedj312 Date: Sat, 26 Jul 2025 20:14:37 +0900 Subject: [PATCH 09/10] =?UTF-8?q?=EC=A4=91=EB=B3=B5=EB=90=98=EB=8A=94=20?= =?UTF-8?q?=EC=8A=A4=ED=86=A0=EC=96=B4=20=ED=95=A8=EC=88=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx | 3 ++- apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx | 4 ++-- apps/wr/app/store/prfmncSttn/pbnstPrfmncSttn/index.tsx | 3 ++- apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx | 2 ++ 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx b/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx index 371ed6cd0..eb7a398b1 100644 --- a/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx @@ -80,6 +80,7 @@ export default function PbnstSttn() { } }, [pbnstSttn.excelList]); useEffect(() => { + if (!pbnstSttn.isInit) { getFlcts(); } @@ -93,7 +94,7 @@ export default function PbnstSttn() { }, [pbnstSttnRes]); useEffect(() => { - pbnSttnInit("1", "15", ref.current, searchYear, pbnstSttn.fclts); + pbnSttnInit("1", "15", ref.current, searchYear, fclts); }, [fclts]); useEffect(() => { diff --git a/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx b/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx index cd451b783..8035d2875 100644 --- a/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx @@ -21,7 +21,7 @@ export default function PbnstPrfmncSttn() { pbnstPrfmncSttn, // pbnstPrfmncInit, pbnstPrfmncSearch, - getFlcts, + getFlctsSttn, prfmnc, pbnNmSearch } = useWrStore((state) => state); @@ -493,7 +493,7 @@ export default function PbnstPrfmncSttn() { sigunText: "" } tableHeadMaker(Number(searchYear), Number(searchYear)); - getFlcts(); + getFlctsSttn(); pbnstPrfmncSearch(1, returnType, "", searchYear, searchYear, fclts) }, []); diff --git a/apps/wr/app/store/prfmncSttn/pbnstPrfmncSttn/index.tsx b/apps/wr/app/store/prfmncSttn/pbnstPrfmncSttn/index.tsx index 727c1337d..13093f98f 100644 --- a/apps/wr/app/store/prfmncSttn/pbnstPrfmncSttn/index.tsx +++ b/apps/wr/app/store/prfmncSttn/pbnstPrfmncSttn/index.tsx @@ -10,6 +10,7 @@ type pbnstPrfmncSttnActions = { tableHeadMaker: (startYear: number, endYear: number) => void; // pbnstPrfmncInit: (page: string, sggOrCity: string) => void; pbnstPrfmncSearch: (page: number, returnType: ReturnType, fcltNm: string, fromDate: string, toDate: string, fclts: string[]) => void; + getFlctsSttn: () => void; } const pbnstPrfmncRes: PrfType[] = []; @@ -115,7 +116,7 @@ export const pbnstPrfmncSttnActionsExport: (set: any) => pbnstPrfmncSttnActions set: any ) => { return { - getFlcts: async () => { + getFlctsSttn: async () => { const fclts = await getFetch(fetchType.WR, '/reuseFc/pubFc') return set((state: pbnstPrfmncSttnState) => ({ pbnstPrfmncSttn: { diff --git a/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx index 3c59c9e3b..542622d34 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx @@ -206,6 +206,7 @@ export const pbnstSttnActionsExport: (set: any) => pbnstSttnActions = ( return { getFlcts: async () => { const fclts = await getFetch(fetchType.WR, '/reuseFc/pubFc') + return set((state: pbnstSttnState) => ({ pbnstSttn: { ...state.pbnstSttn, @@ -293,6 +294,7 @@ export const pbnstSttnActionsExport: (set: any) => pbnstSttnActions = ( year, fclts ); + set((state: pbnstSttnState) => { return { ...state, From 93e8ec1df370bcab7307b5df044befb1618ae9bc Mon Sep 17 00:00:00 2001 From: yschoi Date: Sat, 26 Jul 2025 20:51:56 +0900 Subject: [PATCH 10/10] =?UTF-8?q?=20=EC=8B=9C=EC=84=A4=EB=AC=BC=20bbox=20?= =?UTF-8?q?=EC=A0=84=EB=9E=B5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/ui/map/lib/gis.layer.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/common/business_components/src/ui/map/lib/gis.layer.js b/packages/common/business_components/src/ui/map/lib/gis.layer.js index f0e29d31c..fee3f247b 100644 --- a/packages/common/business_components/src/ui/map/lib/gis.layer.js +++ b/packages/common/business_components/src/ui/map/lib/gis.layer.js @@ -142,7 +142,19 @@ GisOlLayer.prototype = { let returnLayer = this.makeLayer(option); //레이어 소스 생성 - let source = this.getVectorSourceBbox(option); + let source; + + let lyrTyNm = option.lyrTyNm; + if(lyrTyNm == 'tb_ms_flood_dngr_map' + || lyrTyNm == 'tb_ms_sbmrg_dngr_map' + || lyrTyNm == 'tb_ms_swage_mhl' + || lyrTyNm == 'tb_ms_swage_ppl' + ) { + source = this.getVectorSourceBbox(option); + }else { + source = this.getVectorTileSource(option); + } + returnLayer.setSource(source); //스타일 추가 returnLayer.setStyle(this.gisStyle.getLayerStyleFunction(returnLayer, option));