From d4c9989069dfb19608d4dfeb079216ab34a74160 Mon Sep 17 00:00:00 2001 From: yangsein Date: Mon, 15 Jun 2026 00:56:20 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20[=EC=A7=91=EA=B3=84=ED=91=9C]=20?= =?UTF-8?q?=EB=AC=BC=EC=9E=AC=EC=9D=B4=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../statistics/total/WaterReuseTot.tsx | 225 +++++++++++++++++- .../SewerageGrayWaterTab2Column.ts | 48 ++++ .../SewerageRainwaterTab3Column.ts | 33 +++ .../sewerageReuse/SewerageReuseTab1Column.ts | 89 +++++++ .../SewerageWwtRtlztnRegTab4Column.ts | 28 +++ 5 files changed, 420 insertions(+), 3 deletions(-) create mode 100644 apps/st/src/components/util/column/total/sewerageReuse/SewerageGrayWaterTab2Column.ts create mode 100644 apps/st/src/components/util/column/total/sewerageReuse/SewerageRainwaterTab3Column.ts create mode 100644 apps/st/src/components/util/column/total/sewerageReuse/SewerageReuseTab1Column.ts create mode 100644 apps/st/src/components/util/column/total/sewerageReuse/SewerageWwtRtlztnRegTab4Column.ts diff --git a/apps/st/src/components/statistics/total/WaterReuseTot.tsx b/apps/st/src/components/statistics/total/WaterReuseTot.tsx index 567797983..e48d12673 100644 --- a/apps/st/src/components/statistics/total/WaterReuseTot.tsx +++ b/apps/st/src/components/statistics/total/WaterReuseTot.tsx @@ -1,10 +1,229 @@ +import { useRef, useState } from "react"; + +import { useAlertStore } from "@/shared/lib"; +import { LoadingWithAnimation, Tabs, TabsContent, TabsList, TabsTrigger } from "@common/components"; + import SearchForm from "../../module/SearchForm"; +import DataGrid from "@/components/module/DataGrid"; +import type { ColumnInfo } from "@/components/type/DataGrid.type"; +import type { SearchFormValues } from "@/components/type/SearchForm.type"; +import { toGridRows } from "@/components/util/grid/gridFunction"; + +// [폴더 정밀 정비 완료] 프로젝트 트리 구조 5개 컬럼 스펙 패키지 호출 +import { SewerageReuseTab1ColumnConfig } from "@/components/util/column/total/sewerageReuse/SewerageReuseTab1Column"; +import { SewerageGrayWaterTab2ColumnConfig } from "@/components/util/column/total/sewerageReuse/SewerageGrayWaterTab2Column"; +import { SewerageRainwaterTab3ColumnConfig } from "@/components/util/column/total/sewerageReuse/SewerageRainwaterTab3Column"; +import { SewerageWwtRtlztnRegTab4ColumnConfig } from "@/components/util/column/total/sewerageReuse/SewerageWwtRtlztnRegTab4Column"; +import { SewerageWwtRtlztnSncnTab5ColumnConfig } from "@/components/util/column/total/sewerageReuse/SewerageWwtRtlztnSncnTab5Column"; + +// 집계표(TOTAL) API 서비스 및 인터페이스 명세 임포트 +import { statisticsTotalStatusApi } from "@/entities/statistics/api/statistics-total-service"; +import type { + WaterReuseSummaryRequest +} from "@/entities/statistics/model/statistics-total/statistics-sewerage-reuse-total-interface"; +import CellColorInfo from "./CellColorInfo"; + +// 5개 멀티 탭 매핑을 위한 설정 취합 배열 +const WaterReuseColumnListTot = [ + SewerageReuseTab1ColumnConfig, + SewerageGrayWaterTab2ColumnConfig, + SewerageRainwaterTab3ColumnConfig, + SewerageWwtRtlztnRegTab4ColumnConfig, + SewerageWwtRtlztnSncnTab5ColumnConfig // 👈 5번째 탭 풀장착 완료 +]; + +const firstTabKey = WaterReuseColumnListTot[0]?.tabKey ?? "ST00040007_1"; const WaterReuseTot = () => { + const { setMessage: alert } = useAlertStore((state) => state); + + // Map 데이터 구조를 사용하여 완벽하게 안전한 멀티 탭 데이터 상태 유지 + const [rowDataMap, setRowDataMap] = useState[]>>(new Map()); + const [isLoading, setIsLoading] = useState(false); + const [activeTab, setActiveTab] = useState(firstTabKey); + const lastSearchedValuesRef = useRef(null); + + const columnInfo = WaterReuseColumnListTot; + + const handleReset = () => { + setRowDataMap(new Map()); + setActiveTab(firstTabKey); + lastSearchedValuesRef.current = null; + }; + + const loadGridData = async (tabKey: string, values: SearchFormValues): Promise => { + const param: WaterReuseSummaryRequest = { + ctpvNm: values.sido === "ALL" ? "" : values.sido, + sggNm: values.gugun === "ALL" ? "" : values.gugun, + sewerBzmnCd: values.bsnmCd, + statsYr: values.year, + rowDataYn: values.isDetail, + summaryYn: values.isSummary !== 'ALL', + summaryYearCnt: values.isSummary !== 'ALL' ? Number(values.isSummary) : undefined + }; + + try { + // [TAB1] 공공하수처리수 재이용 현황 조회 + if (tabKey === "ST00100001") { + const response = await statisticsTotalStatusApi.getSewerageReuseTab1List(param); + if (response && response.status === "success" && response.data) { + setRowDataMap((prev) => new Map(prev).set(tabKey, toGridRows(response.data as object[]))); + return true; + } + alert(response?.message || "데이터 조회 중 오류가 발생했습니다."); + } + + // [TAB2] 중수도 현황 조회 + if (tabKey === "ST00100002") { + const response = await statisticsTotalStatusApi.getGrayWaterStatusTab2List(param); + if (response && response.status === "success" && response.data) { + setRowDataMap((prev) => new Map(prev).set(tabKey, toGridRows(response.data as object[]))); + return true; + } + alert(response?.message || "데이터 조회 중 오류가 발생했습니다."); + } + + // [TAB3] 빗물이용시설현황 조회 + if (tabKey === "ST00100003") { + const response = await statisticsTotalStatusApi.getRainwaterStatusTab3List(param); + if (response && response.status === "success" && response.data) { + setRowDataMap((prev) => new Map(prev).set(tabKey, toGridRows(response.data as object[]))); + return true; + } + alert(response?.message || "데이터 조회 중 오류가 발생했습니다."); + } + + // [TAB4] 하·폐수처리수 재이용시설 시공업 등록현황 조회 + if (tabKey === "ST00100004") { + const response = await statisticsTotalStatusApi.getWwtRtlztnRegStatusTab4List(param); + if (response && response.status === "success" && response.data) { + setRowDataMap((prev) => new Map(prev).set(tabKey, toGridRows(response.data as object[]))); + return true; + } + alert(response?.message || "데이터 조회 중 오류가 발생했습니다."); + } + + // [TAB5] 하·폐수처리수 재이용시설 시공업 인가현황 조회 + if (tabKey === "ST00100005") { + const response = await statisticsTotalStatusApi.getWwtRtlztnSncnStatusTab5List(param); + if (response && response.status === "success" && response.data) { + setRowDataMap((prev) => new Map(prev).set(tabKey, toGridRows(response.data as object[]))); + return true; + } + alert(response?.message || "데이터 조회 중 오류가 발생했습니다."); + } + return false; + } catch { + alert("서버 연결 중 오류가 발생했습니다."); + return false; + } + }; + + const handleSearch = async (values: SearchFormValues) => { + try { + setIsLoading(true); + const ok = await loadGridData(activeTab, values); + if (ok) { + lastSearchedValuesRef.current = values; + } else { + lastSearchedValuesRef.current = null; + } + } catch { + alert("데이터 조회 중 오류가 발생했습니다."); + lastSearchedValuesRef.current = null; + } finally { + setIsLoading(false); + } + }; + + const handleActiveTabChange = async (tabKey: string) => { + setActiveTab(tabKey); + const values = lastSearchedValuesRef.current; + if (!values) return; + + // 중복 API 통신 방지 필터 캐싱 디스패치 + const existing = rowDataMap.get(tabKey); + if (existing && existing.length > 0) return; + + try { + setIsLoading(true); + await loadGridData(tabKey, values); + } catch { + alert("데이터 조회 중 오류가 발생했습니다."); + } finally { + setIsLoading(false); + } + }; + return ( - <> - - +
+ + + {/* 정중앙 5rem 크기 고정 격리형 로딩 애니메이션 */} + {isLoading && ( +
+
+ +
+
+ )} + + + +
+ void handleActiveTabChange(v)} className="w-full" variant="default"> + + {columnInfo.map((info) => ( + + {info.tabLabel} + + ))} + + + {columnInfo.map((info) => { + const tabKey = info.tabKey; + const rowData = rowDataMap.get(tabKey) ?? []; + + const gridColumnInfo: ColumnInfo = { + columns: info.columns, + columnLayout: info.columnLayout, + }; + + return ( + + { + setRowDataMap((prev) => { + const next = new Map(prev); + const cur = next.get(tabKey) ?? []; + const n = typeof updater === "function" ? updater(cur) : updater; + next.set(tabKey, n); + return next; + }); + }} + isExcelImport={false} + isExcelExport={true} + showHeaderCheckbox={false} + fixedColumns={info.fixedColumns} + enableSort={false} + cellStyleCallback={({ row }) => { + const rowType = String(row.rowType ?? ''); + if (rowType === 'DETAIL') return undefined; + if (rowType === 'BIZ_SUM') return 'rg-cell-rowtype-biz-sum'; + if (rowType === 'SUMMARY') return 'rg-cell-rowtype-summary'; + return 'rg-cell-rowtype-other'; + }} + /> + + ); + })} + +
+
); }; diff --git a/apps/st/src/components/util/column/total/sewerageReuse/SewerageGrayWaterTab2Column.ts b/apps/st/src/components/util/column/total/sewerageReuse/SewerageGrayWaterTab2Column.ts new file mode 100644 index 000000000..6987edb66 --- /dev/null +++ b/apps/st/src/components/util/column/total/sewerageReuse/SewerageGrayWaterTab2Column.ts @@ -0,0 +1,48 @@ +import { ValueType } from "realgrid"; + +export const SewerageGrayWaterTab2ColumnConfig = { + tabKey: "ST00100002", + tabLabel: "중수도 현황", + rowStartNum: 2, // 2단 그룹 헤더이므로 rowStartNum은 2로 지정합니다. + fixedColumns: 1, + columns: [ + // 행정구역 그룹 소속 + { name: "ctpvNm", fieldName: "ctpvNm", header: { text: "시도" }, editable: false }, + { name: "sggNm", fieldName: "sggNm", header: { text: "시군구" }, editable: false }, + { name: "admdstNm", fieldName: "admdstNm", header: { text: "행정구역명" }, editable: false }, + + // 단일 마스터 컬럼들 (image_103ea5 스펙 반영) + { name: "fcltNm", fieldName: "fcltNm", header: { text: "건축물명/\n개발사업명" }, editable: false }, + { name: "bldgSeCn", fieldName: "bldgSeCn", header: { text: "시설물용도/\n개발사업종류" }, editable: false }, + { name: "fcltPstnCn", fieldName: "fcltPstnCn", header: { text: "주소" }, editable: false }, + { name: "lglTrgtYn", fieldName: "lglTrgtYn", header: { text: "법적의무\n대상여부\n(대상/미대상)" }, editable: false }, + { name: "cmptnStrtYmd", fieldName: "cmptnStrtYmd", header: { text: "설치완료일\nyyyy-mm-dd" }, editable: false }, + { name: "oprtngStrtYmd", fieldName: "oprtngStrtYmd", header: { text: "가동개시일\nyyyy-mm-dd" }, editable: false }, + + // 시설현황 그룹 소속 + { name: "archWholArea", fieldName: "archWholArea", header: { text: "건축연면적\n(㎡)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, + { name: "prcsCpct", fieldName: "prcsCpct", header: { text: "처리용량\n(㎡/일)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + + // 이용 현황 소속 컬럼들 + { name: "wtrUseQnt", fieldName: "wtrUseQnt", header: { text: "물 사용량\n(㎡/년)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, + { name: "ruswtrUtztnQnt", fieldName: "ruswtrUtztnQnt", header: { text: "중수도\n이용량(㎡/년)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, + { name: "sbstCntUtztnQnt", fieldName: "sbstCntUtztnQnt", header: { text: "대체수\n이용량(㎡/년)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, + { name: "mnUsgCn", fieldName: "mnUsgCn", header: { text: "중수도용도" }, editable: false }, + { name: "ruswtrOperAmt", fieldName: "ruswtrOperAmt", header: { text: "연간운영비\n(백만원/년)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false } + ], + columnLayout: [ + { name: "areaGroup", header: { text: "행정구역" }, items: ["ctpvNm", "sggNm", "admdstNm"] }, + "fcltNm", + "bldgSeCn", + "fcltPstnCn", + "lglTrgtYn", + "cmptnStrtYmd", + "oprtngStrtYmd", + { name: "facilityStatusGroup", header: { text: "시설현황" }, items: ["archWholArea", "prcsCpct"] }, + "wtrUseQnt", + "ruswtrUtztnQnt", + "sbstCntUtztnQnt", + "mnUsgCn", + "ruswtrOperAmt" + ] +}; \ No newline at end of file diff --git a/apps/st/src/components/util/column/total/sewerageReuse/SewerageRainwaterTab3Column.ts b/apps/st/src/components/util/column/total/sewerageReuse/SewerageRainwaterTab3Column.ts new file mode 100644 index 000000000..84d3d0a7e --- /dev/null +++ b/apps/st/src/components/util/column/total/sewerageReuse/SewerageRainwaterTab3Column.ts @@ -0,0 +1,33 @@ +import { ValueType } from "realgrid"; + +export const SewerageRainwaterTab3ColumnConfig = { + tabKey: "ST00100003", + tabLabel: "빗물이용시설현황", + rowStartNum: 2, + fixedColumns: 3, + columns: [ + { name: "ctpvNm", fieldName: "ctpvNm", header: { text: "시도" }, editable: false }, + { name: "sggNm", fieldName: "sggNm", header: { text: "시군구" }, editable: false }, + { name: "admdstNm", fieldName: "admdstNm", header: { text: "행정구역명" }, editable: false }, + + { name: "fcltNm", fieldName: "fcltNm", header: { text: "시설명" }, editable: false }, + { name: "bdstTypCn", fieldName: "bdstTypCn", header: { text: "건축물용도" }, editable: false }, + { name: "fcltPstnCn", fieldName: "fcltPstnCn", header: { text: "위치(주소)" }, editable: false }, + { name: "lglTrgtYn", fieldName: "lglTrgtYn", header: { text: "법적의무 대상여부\n(대상/미대상)" }, editable: false }, + { name: "instlCmptnYmd", fieldName: "instlCmptnYmd", header: { text: "설치완료일\n(yyyy-mm-dd)" }, editable: false }, + { name: "instlAmt", fieldName: "instlAmt", header: { text: "설치비\n(백만원)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "rcptMynCn", fieldName: "rcptMynCn", header: { text: "집수면 종류" }, editable: false }, + { name: "filtrPrcsFcltYnExpln", fieldName: "filtrPrcsFcltYnExpln", header: { text: "여과등 처리시설 유무" }, editable: false }, + { name: "impdCpct", fieldName: "impdCpct", header: { text: "저류조 용량(㎥)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, + + // 이용 현황 그룹 소속 + { name: "anlUseQnt", fieldName: "anlUseQnt", header: { text: "연간 이용량\n(㎥/년)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0", editable: false }, + { name: "exlnUtlzUsgExpln", fieldName: "exlnUtlzUsgExpln", header: { text: "이용용도" }, editable: false }, + { name: "anlOperAmt", fieldName: "anlOperAmt", header: { text: "연간운영비\n(백만원/년)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false } + ], + columnLayout: [ + { name: "areaGroup", header: { text: "행정구역" }, items: ["ctpvNm", "sggNm", "admdstNm"] }, + "fcltNm", "bdstTypCn", "fcltPstnCn", "lglTrgtYn", "instlCmptnYmd", "instlAmt", "rcptMynCn", "filtrPrcsFcltYnExpln", "impdCpct", + "anlUseQnt", "exlnUtlzUsgExpln", "anlOperAmt" + ] +}; \ No newline at end of file diff --git a/apps/st/src/components/util/column/total/sewerageReuse/SewerageReuseTab1Column.ts b/apps/st/src/components/util/column/total/sewerageReuse/SewerageReuseTab1Column.ts new file mode 100644 index 000000000..6534fa651 --- /dev/null +++ b/apps/st/src/components/util/column/total/sewerageReuse/SewerageReuseTab1Column.ts @@ -0,0 +1,89 @@ +import { ValueType } from "realgrid"; + +export const SewerageReuseTab1ColumnConfig = { + tabKey: "ST00100001", + tabLabel: "공공하수처리수 재이용", + rowStartNum: 4, // 3단 계층 다단 헤더 구조이므로 4로 유지합니다. + fixedColumns: 1, + columns: [ + { name: "ctpvNm", fieldName: "ctpvNm", header: { text: "시도" }, editable: false }, + { name: "sggNm", fieldName: "sggNm", header: { text: "시군구" }, editable: false }, + { name: "admdstNm", fieldName: "admdstNm", header: { text: "행정구역명" }, editable: false }, + + // 하수처리장 + { name: "swtrmtFcltNm", fieldName: "swtrmtFcltNm", header: { text: "시설명" }, editable: false }, + { name: "sncnYmd", fieldName: "sncnYmd", header: { text: "인가일\n(년/월/일)" }, editable: false }, + { name: "prcsFcltCpct", fieldName: "prcsFcltCpct", header: { text: "시설용량\n(㎥/일)" }, editable: false }, + { name: "prcsQnt", fieldName: "prcsQnt", header: { text: "연간\n하수처리량\n(천톤/년)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "lglYn", fieldName: "lglYn", header: { text: "법적의무대상\n(대상/미대상)" }, editable: false }, + + // 재이용시설 설치시 소속 + { name: "instlYn", fieldName: "instlYn", header: { text: "설치유무\n(유/무)" }, editable: false }, + { name: "oprtngStrtYmd", fieldName: "oprtngStrtYmd", header: { text: "가동개시일\nyyyy-mm-dd" }, editable: false }, + { name: "instlAprvYmd", fieldName: "instlAprvYmd", header: { text: "설치승인일\nyyyy-mm-dd" }, editable: false }, + { name: "rprcsFcltCpct", fieldName: "rprcsFcltCpct", header: { text: "용량(톤/일)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "mtcnsNm", fieldName: "mtcnsNm", header: { text: "공법/기자재" }, editable: false }, + { name: "ruswtPplLen", fieldName: "ruswtPplLen", header: { text: "공급관로길이\n(km)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.00", editable: false }, + { name: "ruswtPumpLen", fieldName: "ruswtPumpLen", header: { text: "공급펌프\n(톤/일)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + + // 하수처리수 재이용현황 + { name: "wholUseQnt", fieldName: "wholUseQnt", header: { text: "총계" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "ithlWshwtrQnt", fieldName: "ithlWshwtrQnt", header: { text: "계" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "ithlClnQty", fieldName: "ithlClnQty", header: { text: "세척수" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "ithlFrzgQty", fieldName: "ithlFrzgQty", header: { text: "냉각수" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "ithlLdhcUswtrQnt", fieldName: "ithlLdhcUswtrQnt", header: { text: "청소수" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "ithlDltnUswtrQnt", fieldName: "ithlDltnUswtrQnt", header: { text: "조경용수" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "ithlRuswtrQnt", fieldName: "ithlRuswtrQnt", header: { text: "희석용수" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "ithlEtcQnt", fieldName: "ithlEtcQnt", header: { text: "장내중수도" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "ithlUnsdQnt", fieldName: "ithlUnsdQnt", header: { text: "장내기타용수" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + + { name: "otcntrUswtrWhol", fieldName: "otcntrUswtrWhol", header: { text: "계" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "otcntrClnRstrmQnt", fieldName: "otcntrClnRstrmQnt", header: { text: "청소·화장실\n용수" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "otcntrWshwtrQnt", fieldName: "otcntrWshwtrQnt", header: { text: "세척·살수용수" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "otcntrLdhcUswtrQnt", fieldName: "otcntrLdhcUswtrQnt", header: { text: "조경용수" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "otcntrHdrplUswtrQnt", fieldName: "otcntrHdrplUswtrQnt", header: { text: "친수용수" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "otcntrRvrKeepQnt", fieldName: "otcntrRvrKeepQnt", header: { text: "하천유지용수" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "agrcltUswtrPstnQnt", fieldName: "agrcltUswtrPstnQnt", header: { text: "농업용수" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "ugwtrChargQnt", fieldName: "ugwtrChargQnt", header: { text: "지하수충전" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + { name: "mdsrUswtrQnt", fieldName: "mdsrUswtrQnt", header: { text: "공업용수" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false }, + + { name: "rtlztnRt", fieldName: "rtlztnRt", header: { text: "재이용률\n(%)" }, valueType: ValueType.NUMBER, dataFormat: "#,##0.0", editable: false } + ], + columnLayout: [ + { name: "areaGroup", header: { text: "행정구역" }, items: ["ctpvNm", "sggNm", "admdstNm"] }, + { name: "seweragePlantGroup", header: { text: "하수처리장" }, items: ["swtrmtFcltNm", "sncnYmd", "prcsFcltCpct", "prcsQnt", "lglYn"] }, + { + name: "reuseFacilityGroup", + header: { text: "재이용시설" }, + items: [ + "instlYn", + { + name: "installationGroup", + header: { text: "재이용시설 설치시" }, + items: [ + "oprtngStrtYmd", + "instlAprvYmd", + { + // ★ 핵심 교정: 이미지 명세에 맞춰 내부에 서브 그룹 헤더 추가 완료 + name: "reProcessingFacilityGroup", + header: { text: "재처리시설" }, + items: ["rprcsFcltCpct", "mtcnsNm"] + }, + "ruswtPplLen", + "ruswtPumpLen" + ] + } + ] + }, + { + name: "reuseStatusGroup", + header: { text: "하수처리수 재이용현황(천톤/년)" }, + items: [ + "wholUseQnt", + { name: "internalWaterGroup", header: { text: "장내 용수" }, items: ["ithlWshwtrQnt", "ithlClnQty", "ithlFrzgQty", "ithlLdhcUswtrQnt", "ithlDltnUswtrQnt", "ithlRuswtrQnt", "ithlEtcQnt", "ithlUnsdQnt"] }, + { name: "externalWaterGroup", header: { text: "장외 용수" }, items: ["otcntrUswtrWhol", "otcntrClnRstrmQnt", "otcntrWshwtrQnt", "otcntrLdhcUswtrQnt", "otcntrHdrplUswtrQnt", "otcntrRvrKeepQnt", "agrcltUswtrPstnQnt", "ugwtrChargQnt", "mdsrUswtrQnt"] } + ] + }, + "rtlztnRt" + ] +}; \ No newline at end of file diff --git a/apps/st/src/components/util/column/total/sewerageReuse/SewerageWwtRtlztnRegTab4Column.ts b/apps/st/src/components/util/column/total/sewerageReuse/SewerageWwtRtlztnRegTab4Column.ts new file mode 100644 index 000000000..2d51a5354 --- /dev/null +++ b/apps/st/src/components/util/column/total/sewerageReuse/SewerageWwtRtlztnRegTab4Column.ts @@ -0,0 +1,28 @@ + + + +export const SewerageWwtRtlztnRegTab4ColumnConfig = { + tabKey: "ST00100004", + tabLabel: "하·폐수처리수재이용시설설계시공업등록현황", + rowStartNum: 2, // 행정구역 2단 묶음 헤더 구조이므로 2로 지정합니다. + fixedColumns: 1, + columns: [ + // 행정구역 그룹 소속 + { name: "ctpvNm", fieldName: "ctpvNm", header: { text: "시도" }, editable: false }, + { name: "sggNm", fieldName: "sggNm", header: { text: "시군구" }, editable: false }, + { name: "admdstNm", fieldName: "admdstNm", header: { text: "행정구역명" }, editable: false }, + + // 메인 마스터 문자열 지표들 (화면 그리드 명세서 순서 100% 매칭) + { name: "bplcNm", fieldName: "bplcNm", header: { text: "상호(명칭)" }, editable: false }, + { name: "rprsvNm", fieldName: "rprsvNm", header: { text: "대표자" }, editable: false }, + { name: "bplcPstnCn", fieldName: "bplcPstnCn", header: { text: "주소" }, editable: false }, + { name: "regDt", fieldName: "regDt", header: { text: "등록일\nyyyy-mm-dd" }, editable: false } + ], + columnLayout: [ + { name: "areaGroup", header: { text: "행정구역" }, items: ["ctpvNm", "sggNm", "admdstNm"] }, + "bplcNm", + "rprsvNm", + "bplcPstnCn", + "regDt" + ] +}; \ No newline at end of file