refactor: 02.하수관로 tab2.시설별 설치현황 표준화 데이터 매핑 수정

This commit is contained in:
2026-02-24 17:19:16 +09:00
parent ec250bded1
commit f402961de7
4 changed files with 99 additions and 136 deletions
@@ -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);
}
}
};
@@ -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<string>();
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<string>();
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'
]
},
{
@@ -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<SewagePipeFacilityApiResponse> {
const response = await axios.get<SewagePipeFacilityApiResponse>(
`${ENDPOINT.ST_SERVICE.REVIEW}/sewer-pipe/facility-status`,
@@ -84,56 +84,52 @@ export interface SewagePipeReviewService {
getSewagePipeReviewRegionalList(params: SewagePipeReviewRequestParams): Promise<SewagePipeReviewRegionalApiResponse>;
}
/**
* 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<SewagePipeReviewFacilityItem[]> & {
export type SewagePipeFacilityApiResponse = ApiResponse<SewagePipeFacilityResponseData> & {
message: string;
};
export interface SewagePipeFacilityService {
getSewagePipeFacilityList(params: {
yr?: string; // 조회 연도
bsnmCd?: string; // 사업장 코드
sido?: string; // 시도
gugun?: string; // 구군
}): Promise<SewagePipeFacilityApiResponse>;
getSewagePipeFacilityList(params: SewagePipeReviewRequestParams): Promise<SewagePipeFacilityApiResponse>;
}
/**