From f402961de7a41d99d0f7d3a293026aced47e35b3 Mon Sep 17 00:00:00 2001 From: rsone001 Date: Tue, 24 Feb 2026 17:19:16 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=2002.=ED=95=98=EC=88=98=EA=B4=80?= =?UTF-8?q?=EB=A1=9C=20tab2.=EC=8B=9C=EC=84=A4=EB=B3=84=20=EC=84=A4?= =?UTF-8?q?=EC=B9=98=ED=98=84=ED=99=A9=20=ED=91=9C=EC=A4=80=ED=99=94=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=A7=A4=ED=95=91=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 --- .../statistics/review/SewagePipeRvw.tsx | 49 +++++---- .../util/column/review/SewagePipeRvwColumn.ts | 104 +++++++----------- .../api/statistics-management-service.ts | 7 +- ...statistics-sewage-pipe-review-interface.ts | 75 ++++++------- 4 files changed, 99 insertions(+), 136 deletions(-) diff --git a/apps/st/src/components/statistics/review/SewagePipeRvw.tsx b/apps/st/src/components/statistics/review/SewagePipeRvw.tsx index 2c68978bd..157fd87fd 100644 --- a/apps/st/src/components/statistics/review/SewagePipeRvw.tsx +++ b/apps/st/src/components/statistics/review/SewagePipeRvw.tsx @@ -89,34 +89,35 @@ const SewagePipeRvw = () => { if (hasAData && !hasActiveTabData && searchParamRef.current) { - // try { - // setIsLoading(true); + try { + setIsLoading(true); - // let response; + let response; - // if (tabKey === 'ST00020002') { - // response = await statisticsManagementApi.getSewagePipeFacilityList(searchParamRef.current); - // }else if(tabKey === 'ST00020003'){ - // response = await statisticsManagementApi.getSewagePipeTypeList(searchParamRef.current); - // }else if(tabKey === 'ST00020004'){ - // response = await statisticsManagementApi.getSewagePipeDiamList(searchParamRef.current); - // } + if (tabKey === 'ST00020002') { + response = await statisticsManagementApi.getSewagePipeFacilityList(searchParamRef.current); + } + // }else if(tabKey === 'ST00020003'){ + // response = await statisticsManagementApi.getSewagePipeTypeList(searchParamRef.current); + // }else if(tabKey === 'ST00020004'){ + // response = await statisticsManagementApi.getSewagePipeDiamList(searchParamRef.current); + // } - // if (response?.status === 'success' && response.data) { + if (response?.status === 'success' && response.data) { - // setRowDataMap(prev => { - // const next = new Map(prev); - // next.set(tabKey, toGridRows(response.data as object[])); - // return next; - // }); - // } else { - // alert(response?.message || "데이터가 없습니다."); - // } - // } catch { - // alert('데이터 조회 중 오류가 발생했습니다.'); - // } finally { - // setIsLoading(false); - // } + setRowDataMap(prev => { + const next = new Map(prev); + next.set(tabKey, toGridRows(response.data as object[])); + return next; + }); + } else { + alert(response?.message || "데이터가 없습니다."); + } + } catch { + alert('데이터 조회 중 오류가 발생했습니다.'); + } finally { + setIsLoading(false); + } } }; diff --git a/apps/st/src/components/util/column/review/SewagePipeRvwColumn.ts b/apps/st/src/components/util/column/review/SewagePipeRvwColumn.ts index 9ae786be8..db5034cb3 100644 --- a/apps/st/src/components/util/column/review/SewagePipeRvwColumn.ts +++ b/apps/st/src/components/util/column/review/SewagePipeRvwColumn.ts @@ -170,15 +170,15 @@ const rawList = [ 'pltwtrRcvrCnt', 'rainwtrRcvrCnt', 'rainwtrChmbrCnt', 'rainwtrOutltCnt', 'swrgRegstrCmptExtn', 'swrgRegstrCmptRt', 'rmrk' ] }, - { + { tabKey: 'ST00020002', tabLabel: '시설별 설치현황', rowStartNum: 4, fixedColumns: 3, columns: [ { - name: 'sido', - fieldName: 'sido', + name: 'ctpvNm', + fieldName: 'ctpvNm', header: { text: '시도' }, mergeCells: true, sortdisable: true, @@ -196,7 +196,7 @@ const rawList = [ } } const divisionValues = Array.from(uniqueValues); - return divisionValues.length > divisionIndex ? divisionValues[divisionIndex] + '합계' : '합계'; + return divisionValues.length > divisionIndex ? divisionValues[divisionIndex] + ' 합계' : '합계'; } }, { @@ -212,13 +212,13 @@ const rawList = [ } } const divisionValues = Array.from(uniqueValues); - return divisionValues.length > divisionIndex ? divisionValues[divisionIndex] + '합계' : '합계'; + return divisionValues.length > divisionIndex ? divisionValues[divisionIndex] + ' 합계' : '합계'; } } ] }, - { name: 'gugun', fieldName: 'gugun', header: { text: '시군구' }, mergeCells: true, sortdisable: true }, - { name: 'bscFctNm', fieldName: 'bscFctNm', header: { text: '하수처리장명' },mergeCells: true }, + { name: 'sggNm', fieldName: 'sggNm', header: { text: '시군구' }, mergeCells: true, sortdisable: true }, + { name: 'swrmtFcltyNm', fieldName: 'swrmtFcltyNm', header: { text: '하수처리시설 명칭' }, mergeCells: true }, { name: 'displayYear', fieldName: 'displayYear', @@ -229,108 +229,84 @@ const rawList = [ valueCallback: (grid: GridView, column: DataColumn, footerIndex: number, columnFooter: ColumnFooter, value: number | string | undefined) => { const divisionIndex = 0; const dataSource = grid.getDataSource(); - const rowCount = dataSource.getRowCount(); const uniqueValues = new Set(); - for (let i = 0; i < rowCount; i++) { - const divisionValue = dataSource.getValue(i, 'displayYear'); - if (divisionValue !== null && divisionValue !== undefined && divisionValue !== '') { - uniqueValues.add(String(divisionValue)); - } + for (let i = 0; i < dataSource.getRowCount(); i++) { + const val = dataSource.getValue(i, 'displayYear'); + if (val) uniqueValues.add(String(val)); } - const divisionValues = Array.from(uniqueValues); - return divisionValues.length > divisionIndex ? divisionValues[divisionIndex] + '합계' : ''; + return Array.from(uniqueValues)[divisionIndex] ? Array.from(uniqueValues)[divisionIndex] + ' 합계' : ''; } }, { valueCallback: (grid: GridView, column: DataColumn, footerIndex: number, columnFooter: ColumnFooter, value: number | string | undefined) => { const divisionIndex = 1; const dataSource = grid.getDataSource(); - const rowCount = dataSource.getRowCount(); const uniqueValues = new Set(); - for (let i = 0; i < rowCount; i++) { - const divisionValue = dataSource.getValue(i, 'displayYear'); - if (divisionValue !== null && divisionValue !== undefined && divisionValue !== '') { - uniqueValues.add(String(divisionValue)); - } + for (let i = 0; i < dataSource.getRowCount(); i++) { + const val = dataSource.getValue(i, 'displayYear'); + if (val) uniqueValues.add(String(val)); } - const divisionValues = Array.from(uniqueValues); - return divisionValues.length > divisionIndex ? divisionValues[divisionIndex] + '합계' : ''; + return Array.from(uniqueValues)[divisionIndex] ? Array.from(uniqueValues)[divisionIndex] + ' 합계' : ''; } } ] }, - { name: 'fctCpc', fieldName: 'fctCpc', header: { text: '하수처리\n시설용량\n(㎥/일)' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.0' }, - - /* 처리구역면적(㎢) */ - { name: 'procZoneSm', fieldName: 'procZoneSm', header: { text: '합계' }, footer: footerDecimal3ArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.000' }, + { name: 'swrmtFcltyCpc', fieldName: 'swrmtFcltyCpc', header: { text: '하수처리\n시설용량\n(㎥/일)' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.0' }, + { name: 'procZoneArSm', fieldName: 'procZoneArSm', header: { text: '합계' }, footer: footerDecimal3ArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.000' }, { name: 'cmbnProcZoneAr', fieldName: 'cmbnProcZoneAr', header: { text: '합류식' }, footer: footerDecimal3ArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.000' }, - { name: 'sprtProcZoneAr', fieldName: 'sprtProcZoneAr', header: { text: '분류식' }, footer: footerDecimal3ArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.000' }, - { name: 'sepRate', fieldName: 'sepRate', header: { text: '분류식화(%)' }, footer: footerAvgDecimalArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.0' }, - - /* 배수설비(개소) */ + { name: 'sprsysProcZoneAr', fieldName: 'sprsysProcZoneAr', header: { text: '분류식' }, footer: footerDecimal3ArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.000' }, { name: 'drngEqpSm', fieldName: 'drngEqpSm', header: { text: '합계' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, { name: 'cmbnDrngEqp', fieldName: 'cmbnDrngEqp', header: { text: '합류식' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, - { name: 'sprtDrngEqpSm', fieldName: 'sprtDrngEqpSm', header: { text: '합계(분류)' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, - { name: 'sprtDrngEqpCnnc', fieldName: 'sprtDrngEqpCnnc', header: { text: '연결' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, - { name: 'sprtDrngEqpDcnnc', fieldName: 'sprtDrngEqpDcnnc', header: { text: '미연결' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, - - /* 하수관로 */ - { name: 'piplFcltyExtn', fieldName: 'piplFcltyExtn', header: { text: '총\n시설연장\n(m)' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'icgMnnSm', fieldName: 'icgMnnSm', header: { text: '합계' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'sprsysDrngEqpSm', fieldName: 'sprsysDrngEqpSm', header: { text: '분류식 합계' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, + { name: 'swrgPipeFcltyExtn', fieldName: 'swrgPipeFcltyExtn', header: { text: '총\n시설연장\n(m)' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'icgPltwtrMnnSm', fieldName: 'icgPltwtrMnnSm', header: { text: '합계' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, { name: 'icgExtn', fieldName: 'icgExtn', header: { text: '차집' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'mnnExtn', fieldName: 'mnnExtn', header: { text: '오수간선' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - - /* 토실/토구(개소) */ - { name: 'cmbnSoilholeSite', fieldName: 'cmbnSoilholeSite', header: { text: '우수토실(합류)' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, - { name: 'sprtSoilholeSite', fieldName: 'sprtSoilholeSite', header: { text: '우수토실(분류)' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, - { name: 'sprtSoilspllSite', fieldName: 'sprtSoilspllSite', header: { text: '우수토구(분류)' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, - - /* 지선(m) */ + { name: 'pltwtrMnnExtn', fieldName: 'pltwtrMnnExtn', header: { text: '오수간선' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'cmbnRainwtrChmbrCnt', fieldName: 'cmbnRainwtrChmbrCnt', header: { text: '우수토실(합류)' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, + { name: 'sprsysRainwtrChmbrCnt', fieldName: 'sprsysRainwtrChmbrCnt', header: { text: '우수토실(분류)' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, + { name: 'sprsysRainwtrOutltCnt', fieldName: 'sprsysRainwtrOutltCnt', header: { text: '우수토구(분류)' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0' }, { name: 'brnchlnSm', fieldName: 'brnchlnSm', header: { text: '합계' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, { name: 'cmbnBrnchlnExtn', fieldName: 'cmbnBrnchlnExtn', header: { text: '합류식' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'rainwtrBrnchlnExtn', fieldName: 'rainwtrBrnchlnExtn', header: { text: '우수' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - { name: 'pltwtrBrnchlnExtn', fieldName: 'pltwtrBrnchlnExtn', header: { text: '오수' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, - - { name: 'rmk', fieldName: 'rmk', header: { text: '비고' } }, + { name: 'sprsysExlnBrnchlnExtn', fieldName: 'sprsysExlnBrnchlnExtn', header: { text: '우수' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'sprsysDrtwBrnchlnExtn', fieldName: 'sprsysDrtwBrnchlnExtn', header: { text: '오수' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, numberFormat: '#,##0.00' }, + { name: 'rmrk', fieldName: 'rmrk', header: { text: '비고' } }, ], columnLayout: [ { name: 'addrGroup', header: { text: '행정구역' }, items: [ - { column: 'sido', footerUserSpans: [{ colspan: 4 }, { colspan: 4 }] }, - 'gugun', - 'bscFctNm', + { column: 'ctpvNm', footerUserSpans: [{ colspan: 3 }, { colspan: 3 }] }, + 'sggNm', + 'swrmtFcltyNm', ] }, - - 'fctCpc', + 'swrmtFcltyCpc', 'displayYear', - { name: 'areaGroup', header: { text: '처리구역면적(㎢)' }, items: ['procZoneSm', 'cmbnProcZoneAr', 'sprtProcZoneAr'] }, - 'sepRate', + { name: 'areaGroup', header: { text: '처리구역면적(㎢)' }, items: ['procZoneArSm', 'cmbnProcZoneAr', 'sprsysProcZoneAr'] }, { name: 'drainGroup', header: { text: '배수설비(개소)' }, - items: ['drngEqpSm', 'cmbnDrngEqp', { name: 'sepDrainGroup', header: { text: '분류식' }, items: ['sprtDrngEqpSm', 'sprtDrngEqpCnnc', 'sprtDrngEqpDcnnc'] }], + items: ['drngEqpSm', 'cmbnDrngEqp', 'sprsysDrngEqpSm'], }, { name: 'pipeGroup', header: { text: '하수관로' }, items: [ - 'piplFcltyExtn', - { name: 'trunkGroup', header: { text: '차집/오수간선(m)' }, items: ['icgMnnSm', 'icgExtn', 'mnnExtn'] }, + 'swrgPipeFcltyExtn', + { name: 'trunkGroup', header: { text: '차집/오수간선(m)' }, items: ['icgPltwtrMnnSm', 'icgExtn', 'pltwtrMnnExtn'] }, { name: 'siteGroup', header: { text: '토실/토구(개소)' }, items: [ - { name: 'cmbnSiteGroup', header: { text: '합류식' }, items: ['cmbnSoilholeSite'] }, - { name: 'sepSiteGroup', header: { text: '분류식' }, items: ['sprtSoilholeSite', 'sprtSoilspllSite'] } + { name: 'cmbnSiteGroup', header: { text: '합류식' }, items: ['cmbnRainwtrChmbrCnt'] }, + { name: 'sepSiteGroup', header: { text: '분류식' }, items: ['sprsysRainwtrChmbrCnt', 'sprsysRainwtrOutltCnt'] } ] }, { name: 'branchGroup', header: { text: '지선(m)' }, - items: ['brnchlnSm', 'cmbnBrnchlnExtn', { name: 'sepBranchGroup', header: { text: '우수/오수' }, items: ['rainwtrBrnchlnExtn', 'pltwtrBrnchlnExtn'] }] + items: ['brnchlnSm', 'cmbnBrnchlnExtn', { name: 'sepBranchGroup', header: { text: '우수/오수' }, items: ['sprsysExlnBrnchlnExtn', 'sprsysDrtwBrnchlnExtn'] }] } ], }, - 'rmk' + 'rmrk' ] }, { diff --git a/apps/st/src/entities/statistics/api/statistics-management-service.ts b/apps/st/src/entities/statistics/api/statistics-management-service.ts index bd49adc1c..d514fd576 100644 --- a/apps/st/src/entities/statistics/api/statistics-management-service.ts +++ b/apps/st/src/entities/statistics/api/statistics-management-service.ts @@ -90,12 +90,7 @@ export class StatisticsManagementApiService { * @param params (sido, gugun, yr, bsnmCd) */ public async getSewagePipeFacilityList( - params: { - yr?: string; - bsnmCd?: string; - sido?: string; - gugun?: string; - } + params: SewagePipeReviewRequestParams ): Promise { const response = await axios.get( `${ENDPOINT.ST_SERVICE.REVIEW}/sewer-pipe/facility-status`, 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 index ce3828a22..3d97ec558 100644 --- 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 @@ -84,56 +84,52 @@ export interface SewagePipeReviewService { getSewagePipeReviewRegionalList(params: SewagePipeReviewRequestParams): Promise; } - /** - * 02. 하수관로 시설별 시설현황 (Tab 2) - * + * 02. 하수관로 시설별 설치현황 데이터 항목 (Tab 2) */ export interface SewagePipeReviewFacilityItem { // 1. 행정구역 및 기본 정보 - sido: string; // 시도 - gugun: string; // 시군구 - adstCd: string; // 행정코드 - adstDong: string; // 행정구역명 - yr: string; // 연도 - rowType: 'OLD' | 'CURR'; // 전년도/당해년도 구분 - displayYear: string; // 구분 표시용 (2024년확정 등) + ctpvNm: string; // 시도명 + sggNm: string; // 시군구명 + admdstCd: string; // 행정구역코드 + admdstNm: string; // 행정구역명 + statsYr: string; // 통계연도 + rowType: 'OLD' | 'CURR'; // 데이터 구분 (OLD: 확정, CURR: 당해년도) + displayYear: string; // 화면 표시용 연도 // 2. 시설 정보 - bscFctNm: string; // 하수처리장명 - fctCpc: number; // 하수처리시설용량(㎥/일) + swrmtFcltyNm: string; // 하수처리시설 명칭 + swrmtFcltyCpc: number; // 하수처리시설 용량(㎥/일) - // 3. 처리구역면적(㎢) - procZoneSm: number; // 합계(면적) - cmbnProcZoneAr: number; // 합류식(면적) - sprtProcZoneAr: number; // 분류식(면적) + // 3. 처리구역 면적(㎢) + procZoneArSm: number; // 처리구역 면적 합계 + cmbnProcZoneAr: number; // 합류식 처리구역 면적 + sprsysProcZoneAr: number; // 분류식 처리구역 면적 // 4. 배수설비(개소) - drngEqpSm: number; // 합계(배수) - cmbnDrngEqp: number; // 합류식(배수) - sprtDrngEqpSm: number; // 합계(분류배수) - sprtDrngEqpCnnc: number; // 연결 - sprtDrngEqpDcnnc: number; // 미연결 + drngEqpSm: number; // 배수설비 합계 + cmbnDrngEqp: number; // 합류식 배수설비 + sprsysDrngEqpSm: number; // 분류식 배수설비 합계 // 5. 하수관로 (m) - piplFcltyExtn: number; // 총 시설연장(m) - icgMnnSm: number; // 합계(차집/오수간선) - icgExtn: number; // 차집 - mnnExtn: number; // 오수간선 + swrgPipeFcltyExtn: number; // 총 시설연장 + icgPltwtrMnnSm: number; // 차집 및 오수간선 합계 + icgExtn: number; // 차집관로 연장 + pltwtrMnnExtn: number; // 오수간선 연장 - // 6. 토실/토구 (개소) - cmbnSoilholeSite: number; // 우수토실(합류) - sprtSoilholeSite: number; // 우수토실(분류) - sprtSoilspllSite: number; // 우수토구(분류) + // 6. 우수토실/토구 (개소) + cmbnRainwtrChmbrCnt: number; // 합류식 우수토실 + sprsysRainwtrChmbrCnt: number; // 분류식 우수토실 + sprsysRainwtrOutltCnt: number; // 분류식 우수토구 // 7. 지선 (m) - brnchlnSm: number; // 합계(지선) - cmbnBrnchlnExtn: number; // 합류식(지선) - rainwtrBrnchlnExtn: number; // 우수(지선) - pltwtrBrnchlnExtn: number; // 오수(지선) + brnchlnSm: number; // 지선 합계 + cmbnBrnchlnExtn: number; // 합류식 지선연장 + sprsysExlnBrnchlnExtn: number; // 분류식 우수지선연장 + sprsysDrtwBrnchlnExtn: number; // 분류식 오수지선연장 // 비고 - rmk: string; // 비고 + rmrk: string | null; // 비고 } @@ -141,19 +137,14 @@ export interface SewagePipeFacilityResponseData { facilityPipeList: SewagePipeReviewFacilityItem[]; } -export type SewagePipeFacilityApiResponse = ApiResponse & { + +export type SewagePipeFacilityApiResponse = ApiResponse & { message: string; }; export interface SewagePipeFacilityService { - - getSewagePipeFacilityList(params: { - yr?: string; // 조회 연도 - bsnmCd?: string; // 사업장 코드 - sido?: string; // 시도 - gugun?: string; // 구군 - }): Promise; + getSewagePipeFacilityList(params: SewagePipeReviewRequestParams): Promise; } /**