refactor: 01.하수도보급률 표준화 데이터 매칭 수정

This commit is contained in:
2026-02-23 17:08:56 +09:00
parent 8fa00797c8
commit c2de582b76
4 changed files with 107 additions and 118 deletions
@@ -39,6 +39,7 @@ const SeweragePenetrationRateRvw = () => {
};
const handleSearch = async (values: SearchFormValues) => {
if (values.sido === '' || values.sido === 'ALL') {
alert('시도를 선택해주세요.');
return;
@@ -48,17 +49,18 @@ const SeweragePenetrationRateRvw = () => {
setIsLoading(true);
const response = await statisticsManagementApi.getSewerageSupplyRateReviewList({
sido: values.sido,
gugun: values.gugun === 'ALL' ? '' : values.gugun,
bsnmCd: values.bsnmCd,
yr: values.year,
ctpvNm: values.sido,
sggNm: values.gugun === 'ALL' ? '' : values.gugun,
sewerBzmnCd: values.bsnmCd,
statsYr: values.year,
});
if (response.status === 'success' && response.data) {
const rawList = response.data.sewerageSupplyRateList;
const convertedData: SewerageSupplyRateReviewItem[] = rawList.map((item) => ({
const convertedData: SewerageSupplyRateReviewItem[] = rawList.map((item) => ({
...item,
speclCntrplnAr: !item.speclCntrplnAr ? '해당없음' : item.speclCntrplnAr,
spcCtpnRgnCn: !item.spcCtpnRgnCn ? '해당없음' : item.spcCtpnRgnCn,
}));
setRowData(toGridRows(convertedData));
@@ -4,10 +4,10 @@ import type { GridView, DataColumn, ColumnFooter } from "@/components/type/DataG
const rawSeweragePenetrationRateInfoList = {
columns: [
columns: [
{
name: 'sido',
fieldName: 'sido',
name: 'ctpvNm',
fieldName: 'ctpvNm',
header: { text: '시도' },
mergeCells: true,
sortdisable: true,
@@ -42,8 +42,8 @@ const rawSeweragePenetrationRateInfoList = {
}
]
},
{ name: 'gugun', fieldName: 'gugun', header: { text: '시군구' }, mergeCells: true, sortdisable: true },
{ name: 'adstDong', fieldName: 'adstDong', header: { text: '행정구역명' }, mergeCells: true, sortdisable: true },
{ name: 'sggNm', fieldName: 'sggNm', header: { text: '시군구' }, mergeCells: true, sortdisable: true },
{ name: 'admdstNm', fieldName: 'admdstNm', header: { text: '행정구역명' }, mergeCells: true, sortdisable: true },
{
name: 'displayYear',
fieldName: 'displayYear',
@@ -78,37 +78,37 @@ const rawSeweragePenetrationRateInfoList = {
}
]
},
{ name: 'rvbsn', fieldName: 'rvbsn', header: { text: '수계' } },
{ name: 'bstrm', fieldName: 'bstrm', header: { text: '지류' } },
{ name: 'mdbsn', fieldName: 'mdbsn', header: { text: '세부단위유역' } },
{ name: 'wtsysNm', fieldName: 'wtsysNm', header: { text: '수계' } },
{ name: 'trbtrNm', fieldName: 'trbtrNm', header: { text: '지류' } },
{ name: 'mdbsn', fieldName: 'mdbsn', header: { text: '세부단위유역' } },
{ name: 'lgbsn', fieldName: 'lgbsn', header: { text: '중권역' } },
{ name: 'mdmbsn', fieldName: 'mdmbsn', header: { text: '소권역' } },
{ name: 'speclCntrplnAr', fieldName: 'speclCntrplnAr', header: { text: '특별대책지역' } },
{ name: 'popltnSm', fieldName: 'popltnSm', header: { text: '총인구' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'arSm', fieldName: 'arSm', header: { text: '총면적(㎢)' }, footer: footerDecimal3ArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0.000' },
{ name: 'swgeProcZoneInnerSm', fieldName: 'swgeProcZoneInnerSm', header: { text: '계' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'spcCtpnRgnCn', fieldName: 'spcCtpnRgnCn', header: { text: '특별대책지역' } },
{ name: 'wholPpltnCnt', fieldName: 'wholPpltnCnt', header: { text: '총인구' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'wholArea', fieldName: 'wholArea', header: { text: '총면적(㎢)' }, footer: footerDecimal3ArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0.000' },
{ name: 'wholSwtrmtPpltnCnt', fieldName: 'wholSwtrmtPpltnCnt', header: { text: '계' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'pblswrgPopltnSm', fieldName: 'pblswrgPopltnSm', header: { text: '합계' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'pblswrgPrmTrt', fieldName: 'pblswrgPrmTrt', header: { text: '1차처리' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'pblswrgScdTrt', fieldName: 'pblswrgScdTrt', header: { text: '2차처리' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'pblswrgTertTrt', fieldName: 'pblswrgTertTrt', header: { text: '3차처리' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'wholPblSwtrmtPpltnCnt', fieldName: 'wholPblSwtrmtPpltnCnt', header: { text: '합계' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'ts1SwtrmtPpltnCnt', fieldName: 'ts1SwtrmtPpltnCnt', header: { text: '1차처리' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'ts2SwtrmtPpltnCnt', fieldName: 'ts2SwtrmtPpltnCnt', header: { text: '2차처리' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'ts3SwtrmtPpltnCnt', fieldName: 'ts3SwtrmtPpltnCnt', header: { text: '3차처리' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'wstrPopltnSm', fieldName: 'wstrPopltnSm', header: { text: '합계' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'wstrPrmTrt', fieldName: 'wstrPrmTrt', header: { text: '1차처리' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'wstrScdTrt', fieldName: 'wstrScdTrt', header: { text: '2차처리' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'wstrTertTrt', fieldName: 'wstrTertTrt', header: { text: '3차처리' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'wholWwtPrcsPpltnCnt', fieldName: 'wholWwtPrcsPpltnCnt', header: { text: '합계' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'ts1WwtPrcsPpltnCnt', fieldName: 'ts1WwtPrcsPpltnCnt', header: { text: '1차처리' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'ts2WwtPrcsPpltnCnt', fieldName: 'ts2WwtPrcsPpltnCnt', header: { text: '2차처리' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'ts3WwtPrcsPpltnCnt', fieldName: 'ts3WwtPrcsPpltnCnt', header: { text: '3차처리' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'notConectPopltn', fieldName: 'notConectPopltn', header: { text: '미접속인구' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'swgeProcZoneInnerAr', fieldName: 'swgeProcZoneInnerAr', header: { text: '면적(㎢)' }, footer: footerDecimal3ArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0.000' },
{ name: 'swgeProcZoneOuterSm', fieldName: 'swgeProcZoneOuterSm', header: { text: '계' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'townUnprocPopltn', fieldName: 'townUnprocPopltn', header: { text: '미처리인구' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'townSwttPopltn', fieldName: 'townSwttPopltn', header: { text: '오수처리인구' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'townWrrtnPopltn', fieldName: 'townWrrtnPopltn', header: { text: '정화조인구' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'swgeProcZoneOuterAr', fieldName: 'swgeProcZoneOuterAr', header: { text: '면적(㎢)' }, footer: footerDecimal3ArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0.000' },
{ name: 'pblswrgPopltnSuprt', fieldName: 'pblswrgPopltnSuprt', header: { text: '공공하수처리구역인구보급율(%)' }, footer: footerAvgDecimalArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0.000' },
{ name: 'adtrtPopltnSuprt', fieldName: 'adtrtPopltnSuprt', header: { text: '고도처리인구보급율(%)' }, footer: footerAvgDecimalArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0.000' },
{ name: 'swrgInstlrt', fieldName: 'swrgInstlrt', header: { text: '하수도설치율(%)' }, footer: footerAvgDecimalArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0.000' },
{ name: 'rmk', fieldName: 'rmk', header: { text: '비고' } },
{ name: 'yetCntnPpltnCnt', fieldName: 'yetCntnPpltnCnt', header: { text: '미접속인구' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'staaArea', fieldName: 'staaArea', header: { text: '면적(㎢)' }, footer: footerDecimal3ArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0.000' },
{ name: 'wholStaaExcpPpltnCnt', fieldName: 'wholStaaExcpPpltnCnt', header: { text: '계' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'unprcsPpltnCnt', fieldName: 'unprcsPpltnCnt', header: { text: '미처리인구' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'drtwPrcsPpltnCnt', fieldName: 'drtwPrcsPpltnCnt', header: { text: '오수처리인구' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'spctnkPpltnCnt', fieldName: 'spctnkPpltnCnt', header: { text: '정화조인구' }, footer: footerIntArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0' },
{ name: 'staaExcpArea', fieldName: 'staaExcpArea', header: { text: '면적(㎢)' }, footer: footerDecimal3ArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0.000' },
{ name: 'staaPsplyRt', fieldName: 'staaPsplyRt', header: { text: '공공하수처리구역인구보급율(%)' }, footer: footerAvgDecimalArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0.000' },
{ name: 'altdPrcsPsplyRt', fieldName: 'altdPrcsPsplyRt', header: { text: '고도처리인구보급율(%)' }, footer: footerAvgDecimalArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0.000' },
{ name: 'sewerInstlRt', fieldName: 'sewerInstlRt', header: { text: '하수도설치율(%)' }, footer: footerAvgDecimalArrayByDivision, valueType: ValueType.NUMBER, dataFormat: '#,##0.000' },
{ name: 'rmrk', fieldName: 'rmrk', header: { text: '비고' } },
],
columnLayout: [
{
@@ -116,55 +116,55 @@ const rawSeweragePenetrationRateInfoList = {
hideChildHeaders: false,
header: { text: '행정구역' },
items: [
{ column: 'sido', footerUserSpans: [{ colspan: 4 }, { colspan: 4 }] },
'gugun',
'adstDong',
{ column: 'ctpvNm', footerUserSpans: [{ colspan: 4 }, { colspan: 4 }] },
'sggNm',
'admdstNm',
]
},
'displayYear',
'rvbsn',
'bstrm',
'wtsysNm',
'trbtrNm',
{
name: 'groupB',
hideChildHeaders: false,
header: { text: '수계영향권별분류' },
items: ['mdbsn', 'lgbsn', 'mdmbsn'],
},
'speclCntrplnAr',
'popltnSm',
'arSm',
'spcCtpnRgnCn',
'wholPpltnCnt',
'wholArea',
{
name: 'groupD',
hideChildHeaders: false,
header: { text: '하수처리구역내' },
items: [
'swgeProcZoneInnerSm',
'wholSwtrmtPpltnCnt',
{
name: 'pblswrgGroup',
hideChildHeaders: false,
header: { text: '공공하수처리인구(명)' },
items: ['pblswrgPopltnSm', 'pblswrgPrmTrt', 'pblswrgScdTrt', 'pblswrgTertTrt'],
items: ['wholPblSwtrmtPpltnCnt', 'ts1SwtrmtPpltnCnt', 'ts2SwtrmtPpltnCnt', 'ts3SwtrmtPpltnCnt'],
},
{
name: 'wstrGroup',
hideChildHeaders: false,
header: { text: '폐수처리인구(명)' },
items: ['wstrPopltnSm', 'wstrPrmTrt', 'wstrScdTrt', 'wstrTertTrt'],
items: ['wholWwtPrcsPpltnCnt', 'ts1WwtPrcsPpltnCnt', 'ts2WwtPrcsPpltnCnt', 'ts3WwtPrcsPpltnCnt'],
},
'notConectPopltn',
'swgeProcZoneInnerAr'
'yetCntnPpltnCnt',
'staaArea'
],
},
{
name: 'groupE',
hideChildHeaders: false,
header: { text: '하수처리구역외' },
items: ['swgeProcZoneOuterSm', 'townUnprocPopltn', 'townSwttPopltn', 'townWrrtnPopltn', 'swgeProcZoneOuterAr'],
items: ['wholStaaExcpPpltnCnt', 'unprcsPpltnCnt', 'drtwPrcsPpltnCnt', 'spctnkPpltnCnt', 'staaExcpArea'],
},
'pblswrgPopltnSuprt',
'adtrtPopltnSuprt',
'swrgInstlrt',
'rmk',
'staaPsplyRt',
'altdPrcsPsplyRt',
'sewerInstlRt',
'rmrk',
],
fixedColumns: 2,
rowStartNum: 3
@@ -104,7 +104,6 @@ export interface SewagePipeReviewFacilityItem {
procZoneSm: number; // 합계(면적)
cmbnProcZoneAr: number; // 합류식(면적)
sprtProcZoneAr: number; // 분류식(면적)
sepRate: number; // 분류식화 (%)
// 4. 배수설비(개소)
drngEqpSm: number; // 합계(배수)
@@ -2,69 +2,65 @@ import type { ApiResponse } from "./statistics-interface";
// 검토 01.하수도 보급률 데이터 항목
export interface SewerageSupplyRateReviewItem {
/* 지역 및 구분 정보 */
ctpvNm: string; // 시도명
sggNm: string; // 시군구명
statsYr: string; // 통계연도
admdstNm: string; // 행정구역명
admdstCd: string; // 행정구역코드
displayYear: string; // 화면 표시 연도
rowType: 'OLD' | 'CURR'; // 데이터 구분(OLD: 확정, CURR: 당해년도)
sido: string;
gugun: string;
adstDong: string;
displayYear: string;
rowType: 'OLD' | 'CURR';
adstCd: string;
bsnmCd: string;
yr: number;
/* 수계 및 지역 정보 */
lgbsn: string; // 중권역
mdbsn: string; // 세부단위유역
mdmbsn: string; // 소수계
wtsysNm: string | null; // 수계명
trbtrNm: string | null; // 지류명
spcCtpnRgnCn: string | null; // 특별대책지역내용
/* ======================================================================
* 수계 및 지역 정보
* ====================================================================== */
rvbsn: string;
lgbsn: string;
mdbsn: string;
mdmbsn: string;
wrssm: string | null;
bstrm: string;
speclCntrplnAr: string | null;
/* 인구 및 면적 데이터 */
wholPpltnCnt: number; // 전체인구수(명)
wholArea: number; // 전체면적(㎢)
/* ======================================================================
* 인구 및 면적 데이터 (공통 필드명)
* ====================================================================== */
popltnSm: number; // 총인구
arSm: number; // 총면적(㎢)
/* 하수처리구역내 (groupD) */
swgeProcZoneInnerSm: number; // 계
pblswrgPopltnSm: number; // 공공하수처리인구-합계
pblswrgPrmTrt: number; // 1차처리
pblswrgScdTrt: number; // 2차처리
pblswrgTertTrt: number; // 3차처리
/* 하수처리구역내 */
wholSwtrmtPpltnCnt: number; // 전체하수처리인구수(명)
wholPblSwtrmtPpltnCnt: number; // 전체공공하수처리인구수(명)
ts1SwtrmtPpltnCnt: number; // 1차하수처리인구수(명)
ts2SwtrmtPpltnCnt: number; // 2차하수처리인구수(명)
ts3SwtrmtPpltnCnt: number; // 3차하수처리인구수(명)
wstrPopltnSm: number; // 폐수처리인구-합계
wstrPrmTrt: number; // 1차처리
wstrScdTrt: number; // 2차처리
wstrTertTrt: number; // 3차처리
wholWwtPrcsPpltnCnt: number; // 전체폐수처리인구수(명)
ts1WwtPrcsPpltnCnt: number | null; // 1차폐수처리인구수(명)
ts2WwtPrcsPpltnCnt: number | null; // 2차폐수처리인구수(명)
ts3WwtPrcsPpltnCnt: number | null; // 3차폐수처리인구수(명)
notConectPopltn: number; // 미접속인구
swgeProcZoneInnerAr: number; // 면적(㎢)
yetCntnPpltnCnt: number; // 미접속인구수(명)
staaArea: number; // 하수처리구역면적(㎢)
/* 하수처리구역외 (groupE) */
swgeProcZoneOuterSm: number; // 계
townUnprocPopltn: number; // 미처리인구 (Town + Uptown 합산값)
townSwttPopltn: number; // 오수처리인구 (Town + Uptown 합산값)
townWrrtnPopltn: number; // 정화조인구 (Town + Uptown 합산값)
swgeProcZoneOuterAr: number; // 면적(㎢)
/* 하수처리구역외 */
wholStaaExcpPpltnCnt: number; // 전체하수처리구역외인구수(명)
unprcsPpltnCnt: number | null; // 미처리인구수(명)
drtwPrcsPpltnCnt: number | null; // 오수처리인구수(명)
spctnkPpltnCnt: number | null; // 정화조인구수(명)
staaExcpArea: number; // 하수처리구역외면적(㎢)
/* ======================================================================
* 보급률 및 기타
* ====================================================================== */
pblswrgPopltnSuprt: number; // 공공하수보급률(%)
adtrtPopltnSuprt: number; // 고도처리보급률(%)
swrgInstlrt: number; // 하수도설치율(%)
rmk: string | null; // 비고
/* 보급률 및 기타 */
staaPsplyRt: number; // 하수처리구역보급비율(%)
altdPrcsPsplyRt: number; // 고도처리보급비율(%)
sewerInstlRt: number; // 하수도설치비율(%)
rmrk: string | null; // 비고
/* ======================================================================
* Flag (필요 시 유지)
* ====================================================================== */
lcnt: number | null;
ocnt: number | null;
/* 기타 플래그 */
lcnt?: number | null;
ocnt?: number | null;
}
export interface SewerageSupplyRateReviewRequestParams {
ctpvNm?: string;
sggNm?: string;
statsYr?: string;
sewerBzmnCd?: string;
}
export interface SewerageSupplyRateReviewResponseData {
@@ -75,14 +71,6 @@ export type SewerageSupplyRateReviewApiResponse = ApiResponse<SewerageSupplyRate
message: string;
};
export interface SewerageSupplyRateReviewRequestParams {
sido?: string;
gugun?: string;
yr?: string;
bsnmCd?: string;
}
export interface SewerageSupplyRateReviewService {
getSewerageSupplyRateReviewList(params: SewerageSupplyRateReviewRequestParams): Promise<SewerageSupplyRateReviewApiResponse>;
}