From 0f7e8c1de3621ddcf3d2b785e12d0f5bcc5c4b8e Mon Sep 17 00:00:00 2001 From: rsone001 Date: Tue, 10 Feb 2026 10:16:56 +0900 Subject: [PATCH] =?UTF-8?q?feat:=2002=20=ED=95=98=EC=88=98=EA=B4=80?= =?UTF-8?q?=EB=A1=9C=20tab1=20=EC=A7=80=EC=97=AD=EB=B3=84=20=EC=8B=9C?= =?UTF-8?q?=EC=84=A4=ED=98=84=ED=99=A9=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80=20footer=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=ED=95=84=EC=9A=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../statistics/review/SewagePipeRvw.tsx | 90 +++++--- .../util/column/review/SewagePipeRvwColumn.ts | 193 ++++++++++++------ .../statistics-sewage-pipe-review-service.ts | 34 +++ ...statistics-sewage-pipe-review-interface.ts | 84 ++++++++ 4 files changed, 313 insertions(+), 88 deletions(-) create mode 100644 apps/st/src/entities/statistics/api/statistics-sewage-pipe-review-service.ts create mode 100644 apps/st/src/entities/statistics/model/statistics-sewage-pipe-review-interface.ts diff --git a/apps/st/src/components/statistics/review/SewagePipeRvw.tsx b/apps/st/src/components/statistics/review/SewagePipeRvw.tsx index b0069e506..3bd69c42d 100644 --- a/apps/st/src/components/statistics/review/SewagePipeRvw.tsx +++ b/apps/st/src/components/statistics/review/SewagePipeRvw.tsx @@ -1,53 +1,87 @@ -import { useState } from "react"; - -import { TabDataGrid } from "@rsone/components"; +import { useState, useMemo } from "react"; +// import { TabDataGrid } from "@rsone/components"; +import TabDataGrid from "@/components/module/TabDataGrid"; import SearchForm from "@/components/module/SearchForm"; import SaveButton from "@/components/button/SaveButton"; import ApproveButton from "@/components/button/ApproveButton"; import ReviewOpinionButton from "@/components/button/ReviewOpinionButton"; import ReturnButton from "@/components/button/ReturnButton"; +import { useAlertStore } from "@/shared/lib"; +import { sewagePipeReviewApi } from "@/entities/statistics/api/statistics-sewage-pipe-review-service"; import { SewagePipeColumnInfoListRvw } from "@/components/util/column/review/SewagePipeRvwColumn"; +import type { SearchFormValues } from "@/components/type/SearchForm.type"; +import { toGridRows } from "@/components/util/grid/gridFunction"; -// 하수도 통계 관리 02. 하수관로 const SewagePipeRvw = () => { - const [rowDataMap, setRowDataMap] = useState[]>>(new Map()); + const { setMessage: alert } = useAlertStore((state) => state); + const [rowDataMap, setRowDataMap] = useState>(new Map()); + const [isLoading, setIsLoading] = useState(false); - const approveFunc = () => { - console.log('approveFunc'); - // 승인 로직 - }; + const columnInfo = useMemo(() => { + + return SewagePipeColumnInfoListRvw.map((tab: any) => ({ + ...tab, + columns: tab.columns.map((col: any) => ({ + ...col, + editable: false as const, + styleName: col.styleName ?? ("rg-cell-readonly" as const), + })), + })); + }, []); - const saveFunc = () => { - console.log('submit'); - // 저장 로직 - }; + const handleReset = () => setRowDataMap(new Map()); - const reviewOpinionFunc = () => { - console.log('reviewOpinionFunc'); - // 검토의견 작성 - }; +const handleSearch = async (values: SearchFormValues) => { + try { + setIsLoading(true); + const response = await sewagePipeReviewApi.getSewagePipeReviewList({ + sido: values.sido, + gugun: values.gugun === 'ALL' ? '' : values.gugun, + bsnmCd: values.bsnmCd, + yr: values.year, + }); - const returnFunc = () => { - console.log('returnFunc'); - // 반려 - }; + if (response.status === 'success' && response.data) { + const rawList = response.data; + + console.log("추출된 리스트 (rawList):", rawList); + + const newRowDataMap = new Map(); + + newRowDataMap.set('a', toGridRows(rawList)); + + setRowDataMap(newRowDataMap); + } else { + handleReset(); + alert(response.message || "데이터가 없습니다."); + } + } catch (error) { + console.error("조회 에러:", error); + } finally { + setIsLoading(false); + } +}; return ( <> - +
- - - - + {}} /> + {}} /> + {}} /> + {}} />
- + ); }; - export default SewagePipeRvw; \ No newline at end of file diff --git a/apps/st/src/components/util/column/review/SewagePipeRvwColumn.ts b/apps/st/src/components/util/column/review/SewagePipeRvwColumn.ts index c6b366139..74cbb999b 100644 --- a/apps/st/src/components/util/column/review/SewagePipeRvwColumn.ts +++ b/apps/st/src/components/util/column/review/SewagePipeRvwColumn.ts @@ -1,5 +1,7 @@ import { ValueType } from "realgrid"; const baseYear = new Date().getFullYear(); +import { footerIntArrayByDivision, footerDecimal3ArrayByDivision, footerAvgDecimalArrayByDivision } from "@/components/util/grid/footerSummary"; +import type { GridView, DataColumn, ColumnFooter } from "@/components/type/DataGrid.type"; // 하수도 통계 관리 02. 하수관로 const rawList = [ @@ -9,87 +11,158 @@ const rawList = [ rowStartNum: 4, fixedColumns: 2, columns: [ - /* 기본 정보 */ - { name: 'SIDO', fieldName: '시도', header: { text: '시도' }, mergeCells: true }, - { name: 'GUGUN', fieldName: '시군구', header: { text: '시군구' }, mergeCells: true }, - { name: '구분', fieldName: '구분', header: { text: '구분' }, editable: false, sortdisable: true }, + { + name: 'sido', + fieldName: 'sido', + header: { text: '시도' }, + mergeCells: true, + editable: false, + sortdisable: true, + footer: [ + { + valueCallback: (grid: GridView) => { + const divisionIndex = 0; + const dataSource = grid.getDataSource(); + const uniqueValues = new Set(); + for (let i = 0; i < dataSource.getRowCount(); i++) { + const val = dataSource.getValue(i, 'rgnNm'); + if (val) uniqueValues.add(String(val)); + } + const divisionValues = Array.from(uniqueValues); + return divisionValues.length > divisionIndex ? divisionValues[divisionIndex] + '합계' : '합계'; + } + }, + { + valueCallback: (grid: GridView) => { + const divisionIndex = 1; + const dataSource = grid.getDataSource(); + const uniqueValues = new Set(); + for (let i = 0; i < dataSource.getRowCount(); i++) { + const val = dataSource.getValue(i, 'rgnNm'); + if (val) uniqueValues.add(String(val)); + } + const divisionValues = Array.from(uniqueValues); + return divisionValues.length > divisionIndex ? divisionValues[divisionIndex] + '합계' : '합계'; + } + } + ] + }, + { name: 'gugun', fieldName: 'gugun', header: { text: '시군구' }, mergeCells: true, editable: false, sortdisable: true }, + + { + name: 'rgnNm', + fieldName: 'rgnNm', + header: { text: '구분' }, + editable: false, + sortdisable: true, + footer: [ + { + valueCallback: (grid: GridView) => { + const dataSource = grid.getDataSource(); + const uniqueValues = new Set(); + for (let i = 0; i < dataSource.getRowCount(); i++) { + // 푸터 계산 시에도 displayYr 필드를 참조 + const val = dataSource.getValue(i, 'displayYr'); + if (val) uniqueValues.add(String(val)); + } + const divisionValues = Array.from(uniqueValues); + return divisionValues.length > 0 ? divisionValues[0] + '합계' : ''; + } + }, + { + valueCallback: (grid: GridView) => { + const dataSource = grid.getDataSource(); + const uniqueValues = new Set(); + for (let i = 0; i < dataSource.getRowCount(); i++) { + const val = dataSource.getValue(i, 'displayYr'); + if (val) uniqueValues.add(String(val)); + } + const divisionValues = Array.from(uniqueValues); + return divisionValues.length > 1 ? divisionValues[1] + '합계' : ''; + } + } + ] + }, + /* 하수정비 기본계획 */ - { name: 'TARGET_YR', fieldName: '하수정보기본계획목표년도', header: { text: '하수정보기본계획목표년도' } }, - { name: 'PIPL_IMPRMN_PLAN_EXTN', fieldName: '총관로정비 계획연장(m)', header: { text: '총관로정비\n계획연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'PIPL_PLAN_EXTN', fieldName: '총계획연장(m)', header: { text: '총계획연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'PIPL_FCLTY_EXTN', fieldName: '총시설연장(m)', header: { text: '총시설연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'PIPL_SUPPRT', fieldName: '하수관로 보급률(%)', header: { text: '하수관로\n보급률(%)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'targetYr', fieldName: 'targetYr', header: { text: '하수정보기본계획목표년도' } }, + { name: 'piplImprmnPlanExtn', fieldName: 'piplImprmnPlanExtn', header: { text: '총관로정비\n계획연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'piplPlanExtn', fieldName: 'piplPlanExtn', header: { text: '총계획연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'piplFcltyExtn', fieldName: 'piplFcltyExtn', header: { text: '총시설연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'piplSupprt', fieldName: 'piplSupprt', header: { text: '하수관로\n보급률(%)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, /* 합류식(m) */ - { name: 'CMBN_PLAN_AR', fieldName: '관로정비 계획면적(㎢)_합류', header: { text: '관로정비\n계획면적(㎢)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.000' }, - { name: 'CMBN_IMPRMN_PLAN_EXTN', fieldName: '관로정비 계획연장(m)_합류', header: { text: '관로정비\n계획연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'CMBN_PLAN_EXTN', fieldName: '계획연장(m)_합류', header: { text: '계획연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'CMBN_FCLTY_EXTN', fieldName: '시설연장(m)_합류', header: { text: '시설연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'CMBN_RCTGL_EXTN', fieldName: '사각형(m)_합류', header: { text: '사각형(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'CMBN_CICLE_EXTN', fieldName: '원형(m)_합류', header: { text: '원형(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'CMBN_OPSWR_EXTN', fieldName: '개거(m)_합류', header: { text: '개거(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'CMBN_SDGTTR_EXTN', fieldName: '측구(m)_합류', header: { text: '측구(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'cmbnPlanAr', fieldName: 'cmbnPlanAr', header: { text: '관로정비\n계획면적(㎢)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.000' }, + { name: 'cmbnImprmnPlanExtn', fieldName: 'cmbnImprmnPlanExtn', header: { text: '관로정비\n계획연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'cmbnPlanExtn', fieldName: 'cmbnPlanExtn', header: { text: '계획연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'cmbnFcltyExtn', fieldName: 'cmbnFcltyExtn', header: { text: '시설연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'cmbnRctglExtn', fieldName: 'cmbnRctglExtn', header: { text: '사각형(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'cmbnCicleExtn', fieldName: 'cmbnCicleExtn', header: { text: '원형(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'cmbnOpswrExtn', fieldName: 'cmbnOpswrExtn', header: { text: '개거(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'cmbnSdgttrExtn', fieldName: 'cmbnSdgttrExtn', header: { text: '측구(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, /* 분류식 - 오수관로 */ - { name: 'PLTWTR_PLAN_AR', fieldName: '관로정비 계획면적(㎢)_오수', header: { text: '관로정비\n계획면적(㎢)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.000' }, - { name: 'PLTWTR_IMPRMN_PLAN_EXTN', fieldName: '관로정비 계획연장(m)_오수', header: { text: '관로정비\n계획연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'PLTWTR_PLAN_EXTN', fieldName: '계획연장(m)_오수', header: { text: '계획연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'PLTWTR_FLCTY_EXTN', fieldName: '시설연장(m)_오수', header: { text: '시설연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'PLTWTR_SQRE_EXTN', fieldName: '사각형(m)_오수', header: { text: '사각형(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'PLTWTR_CICL_EXTN', fieldName: '원형(m)_오수', header: { text: '원형(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'pltwtrPlanAr', fieldName: 'pltwtrPlanAr', header: { text: '관로정비\n계획면적(㎢)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.000' }, + { name: 'pltwtrImprmnPlanExtn', fieldName: 'pltwtrImprmnPlanExtn', header: { text: '관로정비\n계획연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'pltwtrPlanExtn', fieldName: 'pltwtrPlanExtn', header: { text: '계획연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'pltwtrFlctyExtn', fieldName: 'pltwtrFlctyExtn', header: { text: '시설연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'pltwtrSqreExtn', fieldName: 'pltwtrSqreExtn', header: { text: '사각형(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'pltwtrCiclExtn', fieldName: 'pltwtrCiclExtn', header: { text: '원형(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, /* 분류식 - 우수관로 */ - { name: 'RAINWTR_PLAN_AR', fieldName: '관로정비 계획면적(㎢)_우수', header: { text: '관로정비\n계획면적(㎢)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.000' }, - { name: 'RAINWTR_IMPRMN_PLAN_EXTN', fieldName: '관로정비 계획연장(m)_우수', header: { text: '관로정비\n계획연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'RAINWTR_PLAN_EXTN', fieldName: '계획연장(m)_우수', header: { text: '계획연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'RAINWTR_FLCTY_EXTN', fieldName: '시설연장(m)_우수', header: { text: '시설연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'RAINWTR_SQRE_EXTN', fieldName: '사각형(m)_우수', header: { text: '사각형(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'RAINWTR_CICL_EXTN', fieldName: '원형(m)_우수', header: { text: '원형(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'RAINWTR_OPSWR_EXTN', fieldName: '개거(m)_우수', header: { text: '개거(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'RAINWTR_SDGTTR_EXTN', fieldName: '측구(m)_우수', header: { text: '측구(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'rainwtrPlanAr', fieldName: 'rainwtrPlanAr', header: { text: '관로정비\n계획면적(㎢)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.000' }, + { name: 'rainwtrImprmnPlanExtn', fieldName: 'rainwtrImprmnPlanExtn', header: { text: '관로정비\n계획연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'rainwtrPlanExtn', fieldName: 'rainwtrPlanExtn', header: { text: '계획연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'rainwtrFlctyExtn', fieldName: 'rainwtrFlctyExtn', header: { text: '시설연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'rainwtrSqreExtn', fieldName: 'rainwtrSqreExtn', header: { text: '사각형(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'rainwtrCiclExtn', fieldName: 'rainwtrCiclExtn', header: { text: '원형(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'rainwtrOpswrExtn', fieldName: 'rainwtrOpswrExtn', header: { text: '개거(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'rainwtrSdgttrExtn', fieldName: 'rainwtrSdgttrExtn', header: { text: '측구(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, /* 부속시설 */ - { name: 'MNHLE_SITE', fieldName: '합류식맨홀(개소)', header: { text: '합류식맨홀(개소)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, - { name: 'PLTWTR_MNHLE_SITE', fieldName: '오수맨홀(개소)', header: { text: '오수맨홀(개소)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, - { name: 'RAINWTR_MNHLE_SITE', fieldName: '우수맨홀(개소)', header: { text: '우수맨홀(개소)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, - { name: 'PLTWTR_RCVR_SITE', fieldName: '오수받이(개소)', header: { text: '오수받이(개소)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, - { name: 'RAINWTR_RCVR_SITE', fieldName: '빗물받이(개소)', header: { text: '빗물받이(개소)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, - { name: 'SOILSPLL_SITE', fieldName: '우수토실(개소)', header: { text: '우수토실(개소)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, - { name: 'SOILHOLE_SITE', fieldName: '우수토구(개소)', header: { text: '우수토구(개소)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, + { name: 'mnhleSite', fieldName: 'mnhleSite', header: { text: '합류식맨홀(개소)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, + { name: 'pltwtrMnhleSite', fieldName: 'pltwtrMnhleSite', header: { text: '오수맨홀(개소)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, + { name: 'rainwtrMnhleSite', fieldName: 'rainwtrMnhleSite', header: { text: '우수맨홀(개소)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, + { name: 'pltwtrRcvrSite', fieldName: 'pltwtrRcvrSite', header: { text: '오수받이(개소)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, + { name: 'rainwtrRcvrSite', fieldName: 'rainwtrRcvrSite', header: { text: '빗물받이(개소)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, + { name: 'soilspllSite', fieldName: 'soilspllSite', header: { text: '우수토실(개소)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, + { name: 'soilholeSite', fieldName: 'soilholeSite', header: { text: '우수토구(개소)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, /* 대장 및 기타 */ - { name: 'SEWER_REGSTR_CMPT_EXTN', fieldName: '하수도대장전산화연장(m)', header: { text: '하수도대장전산화연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, - { name: 'SEWER_REGSTR_CMPT_RT', fieldName: '하수도대장전산화율(%)', header: { text: '하수도대장전산화율(%)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.0' }, - { name: 'RMK', fieldName: '비고', header: { text: '비고' } }, + { name: 'sewerRegstrCmptExtn', fieldName: 'sewerRegstrCmptExtn', header: { text: '하수도대장전산화연장(m)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, + { name: 'sewerRegstrCmptRt', fieldName: 'sewerRegstrCmptRt', header: { text: '하수도대장전산화율(%)' }, valueType: ValueType.NUMBER, numberFormat: '#,##0.0' }, + { name: 'rmk', fieldName: 'rmk', header: { text: '비고' } }, ], columnLayout: [ - { name: 'areaGroup', header: { text: '행정구역' }, items: ['SIDO', 'GUGUN'] }, - '구분', - 'TARGET_YR', 'PIPL_IMPRMN_PLAN_EXTN', 'PIPL_PLAN_EXTN', 'PIPL_FCLTY_EXTN', 'PIPL_SUPPRT', + { name: 'areaGroup', header: { text: '행정구역' }, items: ['sido', 'gugun'] }, + 'rgnNm', + 'targetYr', 'piplImprmnPlanExtn', 'piplPlanExtn', 'piplFcltyExtn', 'piplSupprt', { name: 'combinedGroup', header: { text: '합류식(m)' }, - items: [ 'CMBN_PLAN_AR', 'CMBN_IMPRMN_PLAN_EXTN', 'CMBN_PLAN_EXTN', 'CMBN_FCLTY_EXTN', - { name: 'cmbnAmGroup', header: { text: '암거' }, items: ['CMBN_RCTGL_EXTN', 'CMBN_CICLE_EXTN'] }, - 'CMBN_OPSWR_EXTN', 'CMBN_SDGTTR_EXTN' + items: ['cmbnPlanAr', 'cmbnImprmnPlanExtn', 'cmbnPlanExtn', 'cmbnFcltyExtn', + { name: 'cmbnAmGroup', header: { text: '암거' }, items: ['cmbnRctglExtn', 'cmbnCicleExtn'] }, + 'cmbnOpswrExtn', 'cmbnSdgttrExtn' ], }, { name: 'sepGroup', header: { text: '분류식(m)' }, items: [ - { name: 'foulPipeGroup', header: { text: '오수관로' }, - items: ['PLTWTR_PLAN_AR', 'PLTWTR_IMPRMN_PLAN_EXTN', 'PLTWTR_PLAN_EXTN', 'PLTWTR_FLCTY_EXTN', - { name: 'foulAmGroup', header: { text: '암거' }, items: ['PLTWTR_SQRE_EXTN', 'PLTWTR_CICL_EXTN'] }] + { + name: 'foulPipeGroup', header: { text: '오수관로' }, + items: ['pltwtrPlanAr', 'pltwtrImprmnPlanExtn', 'pltwtrPlanExtn', 'pltwtrFlctyExtn', + { name: 'foulAmGroup', header: { text: '암거' }, items: ['pltwtrSqreExtn', 'pltwtrCiclExtn'] }] }, - { name: 'rainPipeGroup', header: { text: '우수관로' }, - items: ['RAINWTR_PLAN_AR', 'RAINWTR_IMPRMN_PLAN_EXTN', 'RAINWTR_PLAN_EXTN', 'RAINWTR_FLCTY_EXTN', - { name: 'rainAmGroup', header: { text: '암거' }, items: ['RAINWTR_SQRE_EXTN', 'RAINWTR_CICL_EXTN'] }, - 'RAINWTR_OPSWR_EXTN', 'RAINWTR_SDGTTR_EXTN'] + { + name: 'rainPipeGroup', header: { text: '우수관로' }, + items: ['rainwtrPlanAr', 'rainwtrImprmnPlanExtn', 'rainwtrPlanExtn', 'rainwtrFlctyExtn', + { name: 'rainAmGroup', header: { text: '암거' }, items: ['rainwtrSqreExtn', 'rainwtrCiclExtn'] }, + 'rainwtrOpswrExtn', 'rainwtrSdgttrExtn'] } ], }, - 'MNHLE_SITE', - { name: 'fcltyGroup', header: { text: '부속시설(개소)' }, items: ['PLTWTR_MNHLE_SITE', 'RAINWTR_MNHLE_SITE'] }, - 'PLTWTR_RCVR_SITE', 'RAINWTR_RCVR_SITE', 'SOILSPLL_SITE', 'SOILHOLE_SITE', 'SEWER_REGSTR_CMPT_EXTN', 'SEWER_REGSTR_CMPT_RT', 'RMK' + 'mnhleSite', + { name: 'fcltyGroup', header: { text: '부속시설(개소)' }, items: ['pltwtrMnhleSite', 'rainwtrMnhleSite'] }, + 'pltwtrRcvrSite', 'rainwtrRcvrSite', 'soilspllSite', 'soilholeSite', 'sewerRegstrCmptExtn', 'sewerRegstrCmptRt', 'rmk' ] }, { @@ -141,7 +214,7 @@ const rawList = [ 'SEP_RATE', { name: 'drainGroup', header: { text: '배수설비(개소)' }, - items: [ 'DRNG_EQP_SM', 'CMBN_DRNG_EQP', { name: 'sepDrainGroup', header: { text: '분류식' }, items: ['SPRT_DRNG_EQP_SM', 'SPRT_DRNG_EQP_CNNC', 'SPRT_DRNG_EQP_DCNNC'] } ], + items: ['DRNG_EQP_SM', 'CMBN_DRNG_EQP', { name: 'sepDrainGroup', header: { text: '분류식' }, items: ['SPRT_DRNG_EQP_SM', 'SPRT_DRNG_EQP_CNNC', 'SPRT_DRNG_EQP_DCNNC'] }], }, { name: 'pipeGroup', header: { text: '하수관로' }, @@ -157,7 +230,7 @@ const rawList = [ }, { name: 'branchGroup', header: { text: '지선(m)' }, - items: [ 'BRNCHLN_SM', 'CMBN_BRNCHLN_EXTN', { name: 'sepBranchGroup', header: { text: '분류식' }, items: ['RAINWTR_BRNCHLN_EXTN', 'PLTWTR_BRNCHLN_EXTN'] } ] + items: ['BRNCHLN_SM', 'CMBN_BRNCHLN_EXTN', { name: 'sepBranchGroup', header: { text: '분류식' }, items: ['RAINWTR_BRNCHLN_EXTN', 'PLTWTR_BRNCHLN_EXTN'] }] } ], }, @@ -238,6 +311,6 @@ export const SewagePipeColumnInfoListRvw = rawList.map(tab => ({ ...tab, columns: tab.columns.map(col => ({ ...col, - editable: false + editable: false })) })); \ No newline at end of file diff --git a/apps/st/src/entities/statistics/api/statistics-sewage-pipe-review-service.ts b/apps/st/src/entities/statistics/api/statistics-sewage-pipe-review-service.ts new file mode 100644 index 000000000..67d3b9cac --- /dev/null +++ b/apps/st/src/entities/statistics/api/statistics-sewage-pipe-review-service.ts @@ -0,0 +1,34 @@ +import axios from "axios"; +import { ENDPOINT } from "@/shared/config"; + +import { + type SewagePipeReviewService, + type SewagePipeReviewApiResponse, +} from "../model/statistics-sewage-pipe-review-interface"; + + +export class SewagePipeReviewApiService implements SewagePipeReviewService { + /** + * 02. 하수관로 지역별 시설현황 목록 조회 (Tab1) + * @param params (sido, gugun, yr, bsnmCd) + */ + public async getSewagePipeReviewList( + params: { + yr?: string; + bsnmCd?: string; + sido?: string; + gugun?: string; + } + ): Promise { + const response = await axios.get( + `${ENDPOINT.ST_SERVICE.REVIEW}/pipe/tab1`, + { + params: params + } + ); + + return response.data; + } +} + +export const sewagePipeReviewApi = new SewagePipeReviewApiService(); \ No newline at end of file diff --git a/apps/st/src/entities/statistics/model/statistics-sewage-pipe-review-interface.ts b/apps/st/src/entities/statistics/model/statistics-sewage-pipe-review-interface.ts new file mode 100644 index 000000000..ece51825a --- /dev/null +++ b/apps/st/src/entities/statistics/model/statistics-sewage-pipe-review-interface.ts @@ -0,0 +1,84 @@ +import type { ApiResponse } from "./statistics-interface"; + +/** + * 02. 하수관로 지역별 시설현황 아이템 인터페이스 (Tab1) + */ +export interface SewagePipeReviewItem { + // 기본 정보 및 행 제어 + sido: string; // 시도 + gugun: string; // 시군구 + rgnNm: string; // 구분 (연도합계 표시용) + adstDong: string; // 행정구역명 + adstCd: string; // 행정코드 + yr: string; // 연도 + rowType: 'OLD' | 'CURR'; // 전년도/당해년도 구분 + displayYr: string; // 구분 표시용 (2024년확정 등) + + // 하수정비 기본계획 + targetYr: number; // 하수정보기본계획목표년도 + piplImprmnPlanExtn: number; // 총관로정비 계획연장(m) + piplPlanExtn: number; // 총계획연장(m) + piplFcltyExtn: number; // 총시설연장(m) + piplSupprt: number; // 하수관로 보급률(%) + + // 합류식 (CMBN) + cmbnPlanAr: number; // 관로정비 계획면적(㎢) + cmbnImprmnPlanExtn: number; // 관로정비 계획연장(m) + cmbnPlanExtn: number; // 계획연장(m) + cmbnFcltyExtn: number; // 시설연장(m) + cmbnRctglExtn: number; // 사각형(m) + cmbnCicleExtn: number; // 원형(m) + cmbnOpswrExtn: number; // 개거(m) + cmbnSdgttrExtn: number; // 측구(m) + + // 분류식 - 오수관로 (PLTWTR) + pltwtrPlanAr: number; // 관로정비 계획면적(㎢) + pltwtrImprmnPlanExtn: number; // 관로정비 계획연장(m) + pltwtrPlanExtn: number; // 계획연장(m) + pltwtrFlctyExtn: number; // 시설연장(m) + pltwtrSqreExtn: number; // 사각형(m) + pltwtrCiclExtn: number; // 원형(m) + + // 분류식 - 우수관로 (RAINWTR) + rainwtrPlanAr: number; // 관로정비 계획면적(㎢) + rainwtrImprmnPlanExtn: number; // 관로정비 계획연장(m) + rainwtrPlanExtn: number; // 계획연장(m) + rainwtrFlctyExtn: number; // 시설연장(m) + rainwtrSqreExtn: number; // 사각형(m) + rainwtrCiclExtn: number; // 원형(m) + rainwtrOpswrExtn: number; // 개거(m) + rainwtrSdgttrExtn: number; // 측구(m) + + // 부속시설 (개소) + mnhleSite: number; // 합류식맨홀 + pltwtrMnhleSite: number; // 오수맨홀 + rainwtrMnhleSite: number; // 우수맨홀 + pltwtrRcvrSite: number; // 오수받이 + rainwtrRcvrSite: number; // 빗물받이 + soilspllSite: number; // 우수토실 + soilholeSite: number; // 우수토구 + + // 대장 및 기타 + sewerRegstrCmptExtn: number; // 하수도대장 전산화연장(m) + sewerRegstrCmptRt: number; // 하수도대장 전산화율(%) + rmk: string; // 비고 +} + +export interface SewagePipeReviewResponseData { + sewagePipeList: SewagePipeReviewItem[]; +} + + +export type SewagePipeReviewApiResponse = ApiResponse & { + message: string; +}; + +export interface SewagePipeReviewService { + + getSewagePipeReviewList(params: { + yr?: string; // 조회 연도 + bsnmCd?: string; // 사업장 코드 + sido?: string; // 시도 + gugun?: string; // 구군 + }): Promise; +} \ No newline at end of file